问题描述
我尝试使用 sklearn 并遇到错误,但我不知道出了什么问题。 这是我的代码:
import pandas as pdd
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv('vgsales.csv')
X = df.drop(columns=['Name','Platform','Publisher','Genre'])#input
y = df['Rank']#output
model = DecisionTreeClassifier()
model.fit(X,y)
predictions = model.predict([16598],[])
predictions
这是我的错误:
ValueError Traceback (most recent call last)
<ipython-input-28-152586bc1b23> in <module>()
8 df = df.reset_index()
9 model = DecisionTreeClassifier()
---> 10 model.fit(X,y)
11 predictions = model.predict([16598],[])
12 predictions
/home/frankie/anaconda2/lib/python2.7/site-packages/sklearn/tree/tree.pyc in fit(self,X,y,sample_weight,check_input,X_idx_sorted)
788 sample_weight=sample_weight,789 check_input=check_input,--> 790 X_idx_sorted=X_idx_sorted)
791 return self
792
/home/frankie/anaconda2/lib/python2.7/site-packages/sklearn/tree/tree.pyc in fit(self,X_idx_sorted)
114 random_state = check_random_state(self.random_state)
115 if check_input:
--> 116 X = check_array(X,dtype=DTYPE,accept_sparse="csc")
117 y = check_array(y,ensure_2d=False,dtype=None)
118 if issparse(X):
/home/frankie/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.pyc in
check_array(array,accept_sparse,dtype,order,copy,force_all_finite,ensure_2d,allow_nd,ensure_min_samples,ensure_min_features,warn_on_dtype,estimator)
451 % (array.ndim,estimator_name))
452 if force_all_finite:
--> 453 _assert_all_finite(array)
454
455 shape_repr = _shape_repr(array.shape)
/home/frankie/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.pyc in
_assert_all_finite(X)
42 and not np.isfinite(X).all()):
43 raise ValueError("Input contains NaN,infinity"
---> 44 " or a value too large for %r." % X.dtype)
45
46
ValueError: Input contains NaN,infinity or a value too large for dtype('float32').
任何帮助将不胜感激,我正在输入这些东西,因为 stackoverflow 说我需要更多文本
解决方法
代码中的错误
当您为 train 定义 X 和 Y 时,矩阵 X 将包含 de 列 Rank
。 你也应该放弃它。否则,您的决策树将是“愚蠢的”,因为您将输出作为输入。这是一个巨大的错误。解决:
X = df.drop(columns=['Name','Platform','Publisher','Genre','Rank'])#input
您的预测有另一个错误。如果你想预测哪个Rank会是一个输入,你必须给出一个样本或与X格式相同的样本。例如,如果你想对你所有的X进行预测:
predictions = model.predict(X)
您将获得每个 X 行的预测。如果你想对一行进行具体的预测,你必须定义它。
我建议您使用 sklearn.model_selection.train_test_split。 Here 更多信息。
检查导入熊猫(您导入为 pdd):
import pandas as pd
解释你问的错误
正如您在错误中看到的,第一个错误发生在第 10 行:
---> 10 model.fit(X,y)
有了这个信息,并结合最后一行的错误:
ValueError: Input contains NaN,infinity or a value too large for dtype('float32').
我们知道问题出在函数拟合上。该函数正在抱怨,因为在您的 dataFrame 中有空值 (NaN)、无穷大值或太大的值。
检查
要解决这个问题,首先我建议您检查是否有 NaN 值:
df.isnull().any().any()
如果数据帧中有 NaN 值,则此命令返回 True,否则返回 False。点击 here 了解更多信息。
可能你会得到一个 True 值,因为你有 NaN 值。
解决
很明显,我们必须删除或更改 NaN 值,因为函数 fit 不适用于此值。
删除:如果您只有几个 NaN 值,我强烈建议您删除所有这些行:
df.dropna()
更改:另一种解决方案是将 de NaN 值更改为 0。这也将解决此问题,但您必须注意,您正在通过此步骤修改 dataFrame。
df.fillna()
还有其他选项可以替代 NaN 值,例如,对于列的平均值,重复次数最多的...
最终代码应该是这样的:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv('vgsales.csv')
X = df.drop(columns=['Name','Rank'])#input
y = df['Rank']#output
model = DecisionTreeClassifier()
model.fit(X,y)
predictions = model.predict(X)
predictions
希望这能帮助您解决问题! :)