我在测试下面的机器学习代码,然而,对于相同的输入,我得到了不同的输出,这背后的原因可能是什么?
from sklearn import tree# 马力和座位容量 features = [ [300,2], [450,2], [200,8], [150,9] ]# 将超级跑车标记为1,将小型货车标记为2labels = [1,1,2,2] # 决策树分类器 clf = tree.DecisionTreeClassifier()# 在数据中寻找模式 FIT clf.fit(features,labels)result = (clf.predict([[1,2]]))result_extp = { }result_extp[1] = "Super Car"result_extp[2] = "Min Van"# print (result)print(result_extp[result[0]])result_extp = { }result_extp[1] = "Super Car"result_extp[2] = "Mini Van"
编辑:
这是我的输出,更像是随机的:
PS D:\projects\ML> python .\mlforsupercars.py answer : [2] Min Van PS D:\projects\ML> python .\mlforsupercars.py answer : [2] Min Van PS D:\projects\ML> python .\mlforsupercars.py answer : [2] Min Van PS D:\projects\ML> python .\mlforsupercars.py answer : [1] Super Car PS D:\projects\ML> python .\mlforsupercars.py answer : [2] Min Van
回答:
在scikit-learn 0.18.1中无法重现您的问题(但再次强调,您并未证明这个问题确实存在):
import sklearnsklearn.__version__# '0.18.1'# 马力和座位容量 features = [ [300,2], [450,2], [200,8], [150,9] ]# 将超级跑车标记为1,将小型货车标记为2labels = [1,1,2,2] # 决策树分类器 clf = tree.DecisionTreeClassifier()clf.fit(features,labels)result1 = (clf.predict([[1,2]]))print(result1)# [2]result2 = (clf.predict([[1,2]]))print(result2)# [2]print(result1==result2)# [ True]
无论我重新运行result2 = (clf.predict([[1,2]]))
多少次,结果总是[2]
(即'Mini Van'
)。
更新(在编辑中对确切问题的澄清后)
像许多机器学习模型一样,决策树在拟合时包含随机元素;为了在包括拟合此类模型的不同运行之间获得完全可重现的结果,您需要在模型定义中明确提供random_state
参数的值(查看文档)。
在您的案例中,您只需在定义模型时提供一个整数(确切的值并不重要),即:
clf = tree.DecisionTreeClassifier(random_state=42)
之后,您的脚本的所有运行结果都将相同。
无论如何,一个好的主意是用一些与原始特征值范围相似的输入来测试您的模型;在这里,您的features[0]
的范围是150-450,而您用的是1的值进行测试。如果您使用了更现实的输入(例如,使用[180, 7]
而不是[1, 2]
),即便您没有明确设置random_state
,您的预测结果也很有可能会相同(虽然我没有测试过,由于您的训练集非常小,这可能在这里不起作用,因为这可能导致很大的方差)。