Почему я получаю разные результаты для одного и того же ввода в модели машинного обучения - PullRequest
0 голосов
/ 26 сентября 2019

Я тестирую некоторый код машинного обучения, как показано ниже, однако я получаю разные выходы для одного и того же ввода, что может быть причиной этого?

from sklearn import tree

# Horse Power and Seating capacity 
features = [
 [300,2],
 [450,2],
 [200,8],
 [150,9] 
 ]

# change supercar for 1 and minivan for 2
labels = [1,1,2,2] 

# Decision Tree Classifier 
clf = tree.DecisionTreeClassifier()

# Find Pattens in Data 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

1 Ответ

1 голос
/ 26 сентября 2019

Невозможно воспроизвести вашу проблему в scikit-learn 0.18.1 (но, опять же, вы не продемонстрировали , что она вообще существует):

import sklearn
sklearn.__version__
# '0.18.1'

# Horse Power and Seating capacity 
features = [
 [300,2],
 [450,2],
 [200,8],
 [150,9] 
 ]

# change supercar for 1 and minivan for 2
labels = [1,1,2,2] 

# Decision Tree Classifier 
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 , если он установлен;чтобы получить полностью воспроизводимых результатов между различными прогонами, которые включают примерку таких моделей, необходимо явно указать значение для аргумента random_state в определении модели (проверьте docs ).

В вашем случае вы должны просто указать целое число (точное значение не имеет значения) при определении модели, то есть:

clf = tree.DecisionTreeClassifier(random_state=42)

, после чего всеЗапуски вашего скрипта будут одинаковыми.

Независимо от этого, хорошей идеей было бы проверить вашу модель с некоторыми входными данными, которые в некоторой степени напоминают диапазон значений исходных функций;здесь ваш features[0] находится в диапазоне 150-450, при этом вы проверяете его со значением 1. Если вы использовали более реалистичный ввод (скажем, что-то вроде [180, 7] вместо [1, 2]), естьвелика вероятность того, что ваши прогнозы будут такими же, даже если вы не установили явно random_state (хотя не проверяли его, и он может не сработать из-за вашего очень маленького тренировочного набора, что может легко привести к большимдисперсия).

...