泰坦尼克生存预测模型y_pred仅趋近于0问题求助
解决泰坦尼克生存预测中y_pred异常的问题
嘿,作为刚入门Python和机器学习的新手,踩这种坑太正常啦!我帮你排查下问题所在:
1. 最致命的错误:目标变量选砸了
泰坦尼克数据集里,生存标签是Survived列(对应索引1,因为列顺序是PassengerId, Survived, Pclass, Name, Sex...)。但你代码里写的是:
y = dataset.iloc[:, 3].values
这会把第4列的Name(全是字符串)当成预测目标!模型根本没法对字符串标签进行有效训练,输出自然完全不对。
赶紧把y改成正确的目标变量:
y = dataset.iloc[:, 1].values # 或者更直观的写法:y = dataset['Survived'].values
2. 特征预处理完全没做,模型根本没法好好训练
你直接把X = dataset.iloc[:, :-1].values丢给模型,但泰坦尼克数据里一堆坑:
- 有大量缺失值(比如
Age、Cabin列) - 有字符串类型的类别特征(
Sex、Embarked) - 还有
PassengerId、Name这种完全没用的无关特征
这些都得处理才能喂给模型:
- 缺失值填充:比如用均值补
Age,用出现最多的值补Embarked - 类别特征编码:把
Sex转成0/1,把Embarked转成独热编码 - 删掉无关特征:比如
PassengerId、Name、Ticket这些对生存预测没帮助的列
3. 模型选得不对(如果用了回归模型的话)
生存预测是二分类任务,得用分类模型(比如逻辑回归、随机森林分类器),要是你不小心用了线性回归这种回归模型,输出就是连续值,自然不会趋近于0或1。
给你贴一段修正后的极简代码,你可以参考:
# 导入库 import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, StandardScaler from sklearn.impute import SimpleImputer from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 加载数据集 dataset = pd.read_csv('train.csv') # 只选有用的特征,砍掉没用的 X = dataset[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']].values y = dataset['Survived'].values # 正确的目标变量 # 补缺失值:Age用均值,Embarked用最常见值 imputer_num = SimpleImputer(strategy='mean') X[:, 2:3] = imputer_num.fit_transform(X[:, 2:3]) imputer_cat = SimpleImputer(strategy='most_frequent') X[:, 6:7] = imputer_cat.fit_transform(X[:, 6:7]) # 编码类别特征:Sex转0/1,Embarked转独热编码 le = LabelEncoder() X[:, 1] = le.fit_transform(X[:, 1]) from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [6])], remainder='passthrough') X = np.array(ct.fit_transform(X)) # 拆分训练/测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 特征缩放 sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # 训练逻辑回归分类器 classifier = LogisticRegression() classifier.fit(X_train, y_train) # 预测 y_pred = classifier.predict(X_test) # 看看结果,应该是0或1的数组啦 print("准确率:", accuracy_score(y_test, y_pred)) print("前10个预测结果:", y_pred[:10])
最后再啰嗦两句
要是你用predict_proba()方法,输出的是每个样本属于0和1的概率(比如[0.25, 0.75]表示75%概率生存),而predict()直接输出类别标签(0或1)。你之前的异常输出,90%是因为目标变量选成了字符串列导致的,先把这个改了再说!
内容的提问来源于stack exchange,提问作者Banky
相关产品推荐
相关产品推荐

