sklearn.impute.IterativeImputer 的实现
Posted
技术标签:
【中文标题】sklearn.impute.IterativeImputer 的实现【英文标题】:Implementation of sklearn.impute.IterativeImputer 【发布时间】:2019-11-30 21:54:34 【问题描述】:考虑data
,其中包含以下一些nan:
Column-1 Column-2 Column-3 Column-4 Column-5
0 NaN 15.0 63.0 8.0 40.0
1 60.0 51.0 NaN 54.0 31.0
2 15.0 17.0 55.0 80.0 NaN
3 54.0 43.0 70.0 16.0 73.0
4 94.0 31.0 94.0 29.0 53.0
5 99.0 52.0 77.0 91.0 58.0
6 84.0 19.0 36.0 NaN 97.0
7 41.0 91.0 62.0 67.0 68.0
8 44.0 38.0 27.0 53.0 37.0
9 58.0 NaN 63.0 57.0 28.0
10 66.0 68.0 89.0 36.0 47.0
11 7.0 81.0 5.0 99.0 16.0
12 43.0 55.0 64.0 88.0 NaN
13 8.0 90.0 91.0 44.0 4.0
14 29.0 52.0 94.0 71.0 47.0
15 22.0 21.0 68.0 61.0 38.0
16 76.0 36.0 70.0 99.0 50.0
17 38.0 31.0 66.0 79.0 99.0
18 94.0 22.0 92.0 39.0 58.0
我想用sklearn.impute.IterativeImputer
替换data
中的nan。一位朋友帮助我编写了以下代码:
imp = IterativeImputer(missing_values=np.nan, sample_posterior=False,
max_iter=10, tol=0.001,
n_nearest_features=4, initial_strategy='median')
imp.fit(data)
imputed_data = pd.DataFrame(data=imp.transform(data),
columns=['Column-1', 'Column-2', 'Column-3', 'Column-4', 'Column-5'],
dtype='int')
imputed_data
是:
Column-1 Column-2 Column-3 Column-4 Column-5
0 59 15 63 8 40
1 60 51 66 54 31
2 15 17 55 80 48
3 54 43 70 16 73
4 94 31 94 29 53
5 99 52 77 91 58
6 84 19 36 59 97
7 41 91 62 67 68
8 44 38 27 53 37
9 58 46 63 57 28
10 66 68 89 36 47
11 7 81 5 99 16
12 43 55 64 88 47
13 8 90 91 44 4
14 29 52 94 71 47
15 22 21 68 61 38
16 76 36 70 99 50
17 38 31 66 79 99
18 94 22 92 39 58
从IterativeImputer
documentation,默认估计器是BayesianRidge()
。但是,如果我在下面的代码中使用其他估计器,例如 estimator=ExtraTreesRegressor(n_estimators=10, random_state=0)
,它会返回一条警告消息。
代码:
imp = IterativeImputer(estimator=ExtraTreesRegressor(n_estimators=10, random_state=0), missing_values=np.nan, sample_posterior=False,
max_iter=10, tol=0.001,
n_nearest_features=4, initial_strategy='median')
imp.fit(data)
消息:
C:\Users\...\sklearn\impute\_iterative.py:599: ConvergenceWarning: [IterativeImputer] Early stopping criterion not reached. " reached.", ConvergenceWarning).
我的问题:这是一种正确的方法还是我应该采取一些措施来修复警告消息? 谢谢。
【问题讨论】:
这个问题解决了吗?? 【参考方案1】:您是否尝试过先导入 ExtraTreesRegressor。它应该可以正常工作。
from sklearn.ensemble import ExtraTreesRegressor.
同时检查 scikit learn 的版本。应该是0.21.1及以上。
【讨论】:
我确实导入了那个【参考方案2】:他们在这里遇到了同样的问题:
https://github.com/scikit-learn/scikit-learn/issues/14338
【讨论】:
【参考方案3】:由于IterativeImputer()
的参数max_iter=10
和tol=0.001
set,您收到此错误。
10 次迭代 (max_iter=10
) 未满足停止标准 (abs(max(X_t - X_t-1))/abs(max(X[known_vals])) < tol
)。
参考sklearn.impute.IterativeImputer
documentation的参数部分对max_iter
的描述。
克服此错误的一种解决方法是将max_iter
参数值设置得更高。
【讨论】:
以上是关于sklearn.impute.IterativeImputer 的实现的主要内容,如果未能解决你的问题,请参考以下文章