Python 如何处理sklearn中GradientBoostingClassifier中的大量缺失值

Python 如何处理sklearn中GradientBoostingClassifier中的大量缺失值,python,machine-learning,scikit-learn,classification,Python,Machine Learning,Scikit Learn,Classification,所有特征均为浮点数据类型,但也有一些特征以NaN为主。我尝试通过GradientBoostingClassifier训练模型,如下所示 train_x, test_x, train_y, test_y = train_test_split(features[feature_headers], features[target_header], test_size=0.33, random_state=int(time.time())) clf = GradientBoostingClassifie

所有特征均为浮点数据类型,但也有一些特征以NaN为主。我尝试通过
GradientBoostingClassifier
训练模型,如下所示

train_x, test_x, train_y, test_y = train_test_split(features[feature_headers], features[target_header], test_size=0.33, random_state=int(time.time()))
clf = GradientBoostingClassifier(random_state=int(time.time()), learning_rate=0.1, max_leaf_nodes=None, min_samples_leaf=1, n_estimators=300, min_samples_split=2, max_features=None)
clf.fit(train_x, train_y)
但会抛出错误:

ValueError:输入包含NaN、无穷大或对数据类型('float32')太大的值


我不能用一些插补方法用平均数、中位数或最频繁数来填写NaN,因为从数据的角度来看,这没有任何意义。有没有更好的方法让分类器识别NaN并将其视为指示特征?非常感谢。

您必须执行数据清理。为此,您需要查看培训数据集中将包含哪些
列。对于float,您可以将所有
null
值替换为零

df.col1 = df.col1.fillna(0)
对于字符串,可以将其替换为默认值

df.col2 = df.DISTANCE_GROUP.fillna('')
现在,如果您想放置
平均值
或某个趋势值,您可以使用相同的学习算法预测缺失值并填充。为了运行该算法,首先替换空值,然后再使用更精确的预测值进行修改

注意:任何学习算法都不能使用空值运行


xgboost.XGBClassifier
handle
np.nan
无需插补

xgboost
具有易于使用的
sklearn
api


xgboost.XGBClassifier
基本上是非常接近的形式
GradientBoostingClassifier
,两者都是用于分类的梯度增强方法。请参见示例。

为什么不能用零替换NAN?考虑到大多数情况下人们都会插补缺失的NaN值,您的答案是非常具体的。所有列都是浮点格式,它们的范围可能是[负值,正值],因此这意味着实际值可能是0,所以如果我用0填充NaN,这会是一个问题吗?谢谢@jonnybazookatoneAs@Harry_pb注意到,这应该是好的,特别是对于GBC。所有列都是浮点格式,它们的范围可能是[负值,正值],因此这意味着实际值可能是0,所以如果我用0填充NaN,这会是个问题吗?谢谢@JasonZhu我个人使用0,正如我在回答中提到的,我们以后可以使用学习算法预测相同的值,但要运行算法,我们需要替换空值。我更喜欢0,因为它对学习值的方向影响不大。我明白了。谢谢顺便说一句,我有一个值为('a','B',None)的分类列,我将其编码为(1,2,0)。我应该这样做,还是将其保留为字符串格式,以便GradientBoostingClassifier在模型上进行训练?哪一个更好?你的编码还是OneHotEncoding。好的,谢谢两位@jonnybazookatone和Harry_pb