我是 Jupyter 的新手,不知道我在做什么

问题描述

我尝试使用 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

希望这能帮助您解决问题! :)