You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

泰坦尼克生存预测模型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:26:41