我正在进行泰坦尼克号竞赛。这是我目前的代码:
import pandas as pdfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import train_test_splittrain = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/train.csv")test = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/test.csv")train['Sex'].replace(['female', 'male'], [0, 1])train['Embarked'].replace(['C', 'Q', 'S'], [1, 2, 3])# 用每个性别的年龄中位数填充年龄特征的缺失值train['Age'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)linReg = LinearRegression()data = train[['Pclass', 'Sex', 'Parch', 'Fare', 'Age']]# 实现训练测试分割x_train, x_test, y_train, y_test = train_test_split(data, train['Survived'], test_size=0.2, random_state=0)# 训练机器学习算法linReg.fit(x_train, y_train)# 检查模型的准确度得分accuracy = linReg.score(x_test, y_test)print(accuracy*100, '%')
之前这行代码是这样的: data = train[['Pclass', 'Parch', 'Fare', 'Age']]
,结果我的准确度得分是19.5%。我意识到我没有包含性别,所以我接着做了这个:
data = train[['Pclass', 'Sex', 'Parch', 'Fare', 'Age']]
然后,我得到了以下错误:
ValueError: could not convert string to float: 'female'
在这里我意识到我对 train['Sex']
和 train['Age']
所做的更改并没有反映在模型的训练和测试中,这似乎是我模型表现为19.5%的原因。我该如何解决这个问题?
更新
在第一个回答之后,我尝试相应地修改了这一行:
train['Age'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)
为:
train['Age'] = train['Age'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)
然后我决定打印 Age
列,结果发现值已损坏:
0 None1 None2 None3 None4 None5 None6 None7 None8 None9 None10 None11 None12 None13 None14 None15 None16 None17 None18 None19 None20 None21 None22 None23 None24 None25 None26 None27 None28 None29 None ... 861 None862 None863 None864 None865 None866 None867 None868 None869 None870 None871 None872 None873 None874 None875 None876 None877 None878 None879 None880 None881 None882 None883 None884 None885 None886 None887 None888 None889 None890 NoneName: Age, Length: 891, dtype: object
回答:
那是因为你没有保存数据框的修改:
train['Sex'].replace(['female', 'male'], [0, 1])
尝试用这个替换:
train['sex'] = train['Sex'].replace(['female', 'male'], [0, 1])
对 train['Embarked']
也是如此。
更新
对于 train['Age']
,你不需要这样做,fillna 已经通过 inplace=true
修改了现有的数据框。