将啥传递给 clf.predict()?

Posted

技术标签:

【中文标题】将啥传递给 clf.predict()?【英文标题】:What to pass to clf.predict()?将什么传递给 clf.predict()? 【发布时间】:2018-12-15 23:50:24 【问题描述】:

我最近开始使用决策树,我想用一些人造数据训练我自己的简单模型。我想用这个模型来预测一些进一步的模拟数据,只是为了了解它是如何工作的,但后来我卡住了。训练模型后,如何将数据传递给 predict()?

http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

文档状态: clf.predict(X)

参数: X : 形状的类数组或稀疏矩阵 = [n_samples, n_features]

但是当试图传递 np.array、np.ndarray、list、tuple 或 DataFrame 时,它​​只会抛出一个错误。你能帮我理解为什么吗?

代码如下:

from IPython.core.display import display, HTML
display(HTML("<style>.container  width:100% !important; </style>"))

import graphviz
import pandas as pd
import numpy as np
import random
from sklearn import tree

pd.options.display.max_seq_items=5000
pd.options.display.max_rows=20
pd.options.display.max_columns=150

lenght = 50000

miles_commuting = [random.choice([2,3,4,5,7,10,20,25,30]) for x in range(lenght)]
salary = [random.choice([1300,1600,1800,1900,2300,2500,2700,3300,4000]) for x in range(lenght)]
full_time = [random.choice([1,0,1,1,0,1]) for x in range(lenght)]

DataFrame = pd.DataFrame('CommuteInMiles':miles_commuting,'Salary':salary,'FullTimeEmployee':full_time)

DataFrame['Moving'] = np.where((DataFrame.CommuteInMiles > 20) & (DataFrame.Salary > 2000) & (DataFrame.FullTimeEmployee == 1),1,0)
DataFrame['TargetLabel'] = np.where((DataFrame.Moving == 1),'Considering move','Not moving')

target = DataFrame.loc[:,'Moving']
data = DataFrame.loc[:,['CommuteInMiles','Salary','FullTimeEmployee']]
target_names = DataFrame.TargetLabel
features = data.columns.values

clf = tree.DecisionTreeClassifier()
clf = clf.fit(data, target)

clf.predict(?????) #### <===== What should go here?

clf.predict([30,4000,1])

ValueError: Expected 2D array, got 1D array instead: 数组=[3.e+01 4.e+03 1.e+00]。 如果您的数据具有单个特征,则使用 array.reshape(-1, 1) 重塑您的数据,如果数据包含单个样本,则使用 array.reshape(1, -1)。

clf.predict(np.array(30,4000,1))

ValueError: 只接受 2 个非关键字参数

【问题讨论】:

是的,谢谢你的清晰解释 【参考方案1】:

您要预测的“模拟数据”在哪里?

您的数据应该与调用fit() 时使用的形状相同。从上面的代码中,我看到你的 X 有三列['CommuteInMiles','Salary','FullTimeEmployee']。您需要在预测数据中有这么多列,行数可以是任意的。

当你这样做时

clf.predict([30,4000,1])

模型无法理解这些是同一行的列或不同行的数据。

所以你需要将它转换成二维数组,其中内部数组代表单行。

这样做:

clf.predict([[30,4000,1]])     #<== Observe the two square brackets

您可以预测多行,每行都在内部列表中。像这样的:

X_test = [[30,4000,1],
          [35,15000,0],
          [40,2000,1],]
clf.predict(X_test)

至于你最后一个错误clf.predict(np.array(30,4000,1)),这与predict()无关。你用的np.array()错了。

根据the documentation,np.array的签名是:

(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

保留第一个 (object) 所有其他都是关键字参数,因此它们需要按原样使用。但是当您这样做时:np.array(30,4000,1),每个值都被视为此处单独参数的输入:object=30dtype=4000copy=1。这是不允许的,因此会出错。如果你想从列表中创建一个 numpy 数组,你需要传递一个列表。

像这样:np.array([30,4000,1]) 现在这将被正确地视为object 参数的输入。

【讨论】:

以上是关于将啥传递给 clf.predict()?的主要内容,如果未能解决你的问题,请参考以下文章

应该将啥传递给 if() 以打印“Hello World”?

Equatable 的子类将啥传递给超级(Equatable 类)?

将啥传递给 sqlite create_function 任意指针

将啥传递给 Android 的 NDK 以便可以使用 OpenCV 加载图像?

如何在 clf.predict_proba() 中找到对应的类

我应该将啥传递给 SQLitePCL.raw.SetProvider() 以避免“'Microsoft.Data.Sqlite.SqliteConnection' 的类型初始化程序引发异常”