使用 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.datasets
的 load_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.values
和y=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),如何处理线性回归的缺失数据?的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:使用 GaussianNB 在 scikit-learn (sklearn) 中设置具有序列的数组元素
使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列