ADJ*_*ADJ 2 python nan scikit-learn
我正在从csv文件导入一些数据.该文件的nan值标记为文本"NA".我导入数据:
X = genfromtxt(data, delimiter=',', dtype=float, skip_header=1)
Run Code Online (Sandbox Code Playgroud)
我使用此代码用一个普遍计算的列平均值替换nan.
inds = np.where(np.isnan(X))
X[inds]=np.take(col_mean,inds[1])
Run Code Online (Sandbox Code Playgroud)
然后我运行几个检查并获得空数组:
np.where(np.isnan(X))
np.where(np.isinf(X))
Run Code Online (Sandbox Code Playgroud)
最后我运行了一个scikit分类器:
RF = ensemble.RandomForestClassifier(n_estimators=100,n_jobs=-1,verbose=2)
RF.fit(X, y)
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
File "C:\Users\m&g\Anaconda\lib\site-packages\sklearn\ensemble\forest.py", line 257, in fit
check_ccontiguous=True)
File "C:\Users\m&g\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 233, in check_arrays
_assert_all_finite(array)
File "C:\Users\m&g\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 27, in _assert_all_finite
raise ValueError("Array contains NaN or infinity.")
ValueError: Array contains NaN or infinity.
Run Code Online (Sandbox Code Playgroud)
有什么想法告诉我有NaN或无穷大?我看过这篇文章并尝试运行:
RF.fit(X.astype(float), y.astype(float))
Run Code Online (Sandbox Code Playgroud)
但我得到了同样的错误.
scikit-learn的决策树投入了他们的输入以float32提高效率,但您的值不适合该类型:
>>> np.float32(8.9932064170227995e+41)
inf
Run Code Online (Sandbox Code Playgroud)
解决方案是在拟合模型之前进行标准化sklearn.preprocessing.StandardScaler.transform在预测之前不要忘记.您可以使用a sklearn.pipeline.Pipeline在单个对象中组合标准化和分类:
rf = Pipeline([("scale", StandardScaler()),
("rf", RandomForestClassifier(n_estimators=100, n_jobs=-1, verbose=2))])
Run Code Online (Sandbox Code Playgroud)
或者,使用当前的dev版本/下一个版本:
rf = make_pipeline(StandardScaler(),
RandomForestClassifier(n_estimators=100, n_jobs=-1, verbose=2))
Run Code Online (Sandbox Code Playgroud)
(我承认错误信息可以改进.)
| 归档时间: |
|
| 查看次数: |
6125 次 |
| 最近记录: |