在 X 是 pandas.DataFRame 对象的 RandomForest 分类器上使用 fit() 时出错

数据挖掘 机器学习 分类 scikit-学习 熊猫 随机森林
2022-02-14 14:30:24

在 sklearn.ensemble.RandomForestClassifier 上使用 fit() 方法时,我收到一个值错误。

ValueError: could not convert string to float: 'male'

使用的数据集是泰坦尼克号:Kaggle 上的灾难机器学习竞赛中的数据集。这是链接- https://www.kaggle.com/c/titanic 有人可以帮我解决这个问题,为什么会发生以及将来如何防止它。

注意-train_X 的 DataFrame 中没有 NaN,即我已将所有 NaN 替换为 df.fillna(df.mean()),我还通过使用交叉检查了不存在 NaN 值

train_X.isnull().sum()

其中,train_X 是特征的训练数据。请帮忙!!

2个回答

您不能将分类变量按原样传递给sklearn's 分类器之一。处理这个问题的一种方法是对有问题的列进行虚拟编码。

我意识到在此站点上发布最少、完整、可验证的代码并不是严格要求,但如果您提供可以由其他人运行的代码,这样他们就可以直接找到解决方案,而不必猜测发生了什么,这将有所帮助你的错误信息。

这是一些重现您的错误的代码:

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

df = pd.DataFrame({'sex': ['male', 'female', 'female', 'male', 'female'], 'survived': [0, 1, 1, 0, 1]})
rf = RandomForestClassifier()
rf.fit(df.drop('survived', axis=1), df['survived'])

我们可以使用get_dummies函数 from来修复错误pandas以下代码没有错误:

df_dummies = pd.get_dummies(df)
rf.fit(df_dummies.drop('survived', axis=1), df_dummies['survived'])

作为@marco_gorelli 答案的扩展,除了单热编码之外的另一种选择是使用LabelEncodersklearn。

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df['sex_enc'] = le.fit_transform(df['sex'])
df['sex_enc'] = df['sex_enc'].astype('category')