将啥传递给 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=30
、dtype=4000
、copy=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' 的类型初始化程序引发异常”