使用 scikit-learn (sklearn),如何处理线性回归的缺失数据?

Posted

技术标签:

【中文标题】使用 scikit-learn (sklearn),如何处理线性回归的缺失数据?【英文标题】:Using scikit-learn (sklearn), how to handle missing data for linear regression? 【发布时间】:2016-01-11 20:52:18 【问题描述】:

我尝试了这个,但无法让它为我的数据工作: Use Scikit Learn to do linear regression on a time series pandas data frame

我的数据由 2 个 DataFrames 组成。 DataFrame_1.shape = (40,5000)DataFrame_2.shape = (40,74)。我正在尝试进行某种类型的线性回归,但 DataFrame_2 包含 NaN 缺失数据值。当我DataFrame_2.dropna(how="any") 时,形状下降到(2,74)

sklearn中有没有可以处理NaN值的线性回归算法?

我在 sklearn.datasetsload_boston 之后对其进行建模,其中 X,y = boston.data, boston.target = (506,13),(506,)

这是我的简化代码:

X = DataFrame_1
for col in DataFrame_2.columns:
    y = DataFrame_2[col]
    model = LinearRegression()
    model.fit(X,y)

#ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

我使用上述格式来获得与矩阵匹配的形状

如果发布DataFrame_2 会有所帮助,请在下面发表评论,我会添加它。

【问题讨论】:

【参考方案1】:

您可以在y 中填写空值进行插补。在scikit-learn 中,这是通过以下代码 sn-p 完成的:

from sklearn.preprocessing import Imputer
imputer = Imputer()
y_imputed = imputer.fit_transform(y)

否则,您可能希望使用 74 列的子集作为预测变量来构建模型,也许您的某些列包含较少的空值?

【讨论】:

我用我的专栏尝试了这个并得到了TypeError: unbound method fit_transform() must be called with Imputer instance as first argument (got Series instance instead) 然后用整个 DataFrame 尝试了它并得到了同样的东西(用 DataFrame 而不是 Series) 使用 scikit,您需要调用底层 numpy 数组而不是数据帧本身;你应该已经设置了X=DataFrame_1.valuesy=Dataframe_2.values 哎呀,我给了你错误的 imputer 语法,我已经修复了代码 我不明白的是为什么y_imputed 返回一个长度与原始数据框中列的原始len 长度不同的numpy 数组?包括未估算的数字,因此它不是显示“仅估算”的问题。什么给了? Imputer 在 sklearn 0.23.2 中已弃用,请使用 sklearn.impute.SimpleImputer【参考方案2】:

如果你的变量是一个 DataFrame,你可以使用fillna。在这里,我用该列的平均值替换了缺失的数据。

df.fillna(df.mean(), inplace=True)

【讨论】:

是的!这是sklearn imputer的默认功能

以上是关于使用 scikit-learn (sklearn),如何处理线性回归的缺失数据?的主要内容,如果未能解决你的问题,请参考以下文章

skLearn 支持向量机

ValueError:使用 GaussianNB 在 scikit-learn (sklearn) 中设置具有序列的数组元素

Sklearn K均值聚类

使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列

sklearn (scikit-learn) 逻辑回归包——设置训练的分类系数。

Python---scikit-learn(sklearn)模块