sklearn.impute.IterativeImputer 的实现

k.k*_*o3n 7 python missing-data dataframe scikit-learn imputation

考虑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
Run Code Online (Sandbox Code Playgroud)

我想在datausing 中替换 nan sklearn.impute.IterativeImputer。一个朋友帮我写了下面的代码:

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')
Run Code Online (Sandbox Code Playgroud)

该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
Run Code Online (Sandbox Code Playgroud)

从IterativeImputer 文档中,默认的估算器是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)
Run Code Online (Sandbox Code Playgroud)

消息:

C:\Users\...\sklearn\impute\_iterative.py:599: ConvergenceWarning: [IterativeImputer] Early stopping criterion not reached. " reached.", ConvergenceWarning).
Run Code Online (Sandbox Code Playgroud)

我的问题:这是一种正确的方法还是我应该做些什么来修复警告消息?
谢谢你。

小智 5

您收到此错误是因为 的参数max_iter=10&tol=0.001设置IterativeImputer()。

abs(max(X_t - X_{t-1}))/abs(max(X[known_vals])) < tol10 次迭代 ( ) 未满足停止标准 ( ) max_iter=10。

请参阅文档max_iter参数部分中的描述。sklearn.impute.IterativeImputer

克服此错误的一种解决方法是将max_iter参数值设置得更高。


小智 -1

您是否尝试先导入 ExtraTreesRegressor?它应该工作正常。

from sklearn.ensemble import ExtraTreesRegressor.
Run Code Online (Sandbox Code Playgroud)

还要检查 scikit learn 的版本。应为 0.21.1 及以上。