Как рассчитать 0-1 балл для DecisionTreeClassifier? - PullRequest
1 голос
/ 29 мая 2019

Dataset 0-9 столбцов: функции с плавающей точкой (параметры продукта) 10 столбец: int label (продукты)

Цель

  1. Рассчитать 0-1 оценку достоверности классификации для меток (это то, что должен делать мой текущий код)

  2. Рассчитать один и тот же показатель достоверности для каждого «product_name» (300 столбцов) в каждой строке (22'000)

ОШИБКА Я использую sklearn.tree.DecisionTreeClassifier. Я пытаюсь использовать "Предсказание_процесса", но выдает ошибку.

КОД Python

data_train = pd.read_csv('data.csv')
features = data_train.columns[:-1]
labels = data_train.columns[-1]
x_features = data_train[features]
x_label = data_train[labels]
X_train, X_test, y_train, y_test = train_test_split(x_features, x_label, random_state=0)
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

clf = DecisionTreeClassifier(max_depth=3).fit(X_train, y_train)
class_probabilitiesDec = clf.predict_proba(y_train) 
#ERORR: ValueError: Number of features of the model must match the input. Model n_features is 10 and input n_features is 16722 


print('Decision Tree Classification Accuracy Training Score (max_depth=3): {:.2f}'.format(clf.score(X_train, y_train)*100) + ('%'))
print('Decision Tree Classification Accuracy Test Score (max_depth=3): {:.2f}'.format(clf.score(X_test, y_test)*100) + ('%'))

print(class_probabilitiesDec[:10])
# if I use X_tranin than it jsut prints out a buch of 41 element vectors: [[ 0.00490808  0.00765327  0.01123035  0.00332751  0.00665502  0.00357707
   0.05182597  0.03169453  0.04267532  0.02761833  0.01988187  0.01281091
   0.02936528  0.03934781  0.02329257  0.02961484  0.0353548   0.02503951
   0.03577073  0.04700108  0.07661592  0.04433907  0.03019715  0.02196157
   0.0108976   0.0074869   0.0291989   0.03951418  0.01372598  0.0176358
   0.02345895  0.0169703   0.02487314  0.01813493  0.0482489   0.01988187
   0.03252641  0.01572249  0.01455786  0.00457533  0.00083188]
 [....

ОСОБЕННОСТИ (КОЛОННЫ)

(последние столбцы - метки) 0 1 1 1 1,0 1462293561 1462293561 0 0 0,0 0,0 1 1 2 2 2 8,0 1460211580 1461091152 1 1 0,0 0,0 2 2 3 3 3 1,0 1469869039 1470560880 1 1 0,0 0,0 3 3 4 4 4 1,0 1461482675 1461482675 0 0 0,0 0,0 4 4 5 5 5 5,0 1462173043 1462386863 1 1 0,0 0,0 5

КОЛОННЫ КЛАССОВ (300 КОЛОНН ИЗДЕЛИЙ)

HEADER ROW: батарея яблочного геймбоя .... СЧЕТ в 1-м ряду: 0,763 0,346 0,345 .... СЧЕТ во 2-м ряду: 0,256 0,732 0,935 ....

Пример: аналогичные оценки используются, когда кто-то изображение классифицирует кошку VS. Собака и классификация дает оценки достоверности.

1 Ответ

2 голосов
/ 29 мая 2019

Вы не можете предсказать вероятность ваших меток.

predict_proba предсказывает вероятность для каждого ярлыка из ваших данных X, таким образом:

class_probabilitiesDec = clf.predict_proba(X_test) 

То, что вы упоминаете как «когда я использую X_train»:

[[ 0.00490808  0.00765327  0.01123035  0.00332751  0.00665502  0.00357707
   0.05182597  0.03169453  0.04267532  0.02761833  0.01988187  0.01281091
   0.02936528  0.03934781  0.02329257  0.02961484  0.0353548   0.02503951
   0.03577073  0.04700108  0.07661592  0.04433907  0.03019715  0.02196157
   0.0108976   0.0074869   0.0291989   0.03951418  0.01372598  0.0176358
   0.02345895  0.0169703   0.02487314  0.01813493  0.0482489   0.01988187
   0.03252641  0.01572249  0.01455786  0.00457533  0.00083188]

Список вероятности истинности для каждого возможного ярлыка.

EDIT

После прочтения ваших комментариев предскажите, что проба именно то, что вы хотите.

Давайте приведем пример. В следующем коде у нас есть классификатор с 3 классами: 11, 12 или 13.

Если вход равен 1, классификатор должен прогнозировать 11

Если входное значение равно 2, классификатор должен прогнозировать 12

...

Если входное значение равно 7, классификатор должен прогнозировать 12

clf = DecisionTreeClassifier()
clf.fit([[1],[2],[3],[4],[5],[6],[7]], [[11],[12],[13],[13],[12],[11],[13]])

теперь, если у вас есть тестовые данные в одной строке, например 5, чем классификатор должен предсказать 12. Итак, давайте попробуем это.

clf.predict([[5]])

И вуаля: результат array([12])

если мы хотим получить вероятность, тогда предсказуем, что проба - это путь:

clf.predict_proba([[5]])

и мы получаем [array([0., 1., 0.])]

В этом случае массив [0., 1., 0.] означает:

0% вероятности для класса 11

100% вероятность для класса 12

0% вероятности для класса 13

Если я прав, это именно то, что вы хотите. Вы даже можете сопоставить это с именами ваших классов с помощью:

probabilities = clf.predict_proba([[5]])[0]
{clf.classes_[i] : probabilities[i] for i in range(len(probabilities))}

, который дает вам словарь с вероятностями для имен классов:

{11: 0.0, 12: 1.0, 13: 0.0}

Теперь в вашем случае у вас намного больше классов, чем только [11,12,13], поэтому массив становится длиннее. И для каждой строки в вашем наборе данных Forex_proba создает массив, поэтому для более чем одной строки данных ваш вывод становится матрицей.

...