Как вы передаете данные 'str' в дерево решений без горячего кодирования? - PullRequest
0 голосов
/ 18 февраля 2019

Я работаю над лингвистическими данными для обучения классификатора (дерева решений).Данные представлены в формате csv, разделены табуляцией и содержат 62000 строк и 11 столбцов.

Образец данных:

target_lemma    target_pos  left_word   left_word_pos   right_word  right_word_pos  parrent_word    parrent_word_pos    arg_word    arg_word_pos    label```

form    VBZ %%  %%  forms   VBZ forms   VBZ forms   VBZ N```

form    VBZ provINce    NN  %%  %%  forms   VBZ forms   VBZ N```

form    VBZ The DT  %%  %%  forms   VBZ provINce    NN  N```
  • В этих данных значение Null заменяется на %%.
  • Первые 10 значений являются признаками
  • Последнее значение - это метка, которая является либо N, либо Y.

Дерево решений выдает ошибку, так как ожидает, что функции будут intили значения с плавающей запятой.Чтобы решить эту проблему, я закодировал данные с помощью горячего энкодера, и он отлично работает с данными, разделенными на 80,20.

Настоящая проблема возникает, когда я даю пользователю ввод без метки.Я преобразую входные данные в закодированные данные в горячем виде и передаю их предиктору.Это дает мне ошибку значения, говоря, что число функций не равно n_features - 11823, а input_features - 10.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.feature_extraction import FeatureHasher

h = FeatureHasher(input_type='string')

balance_data = pd.read_csv('identifier-tab.csv',
                       delimiter='\t',
                       encoding="ISO-8859-1")

# Splitting Dataset
Y = balance_data.label
X = balance_data.drop(columns='label')

X = pd.get_dummies(X)
Y = pd.get_dummies(Y)


X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=100)
print(X_test)

# Gini
clf_gini = DecisionTreeClassifier(criterion="gini", random_state=100, max_depth=9, min_samples_leaf=9)
clf_gini.fit(X_train, y_train)
y_pred = clf_gini.predict(X_test)
print("Gini Predicted values:")
print(y_pred)
print("Gini Accuracy: ", accuracy_score(y_test, y_pred) * 100)


# Entropy
clf_entropy = DecisionTreeClassifier(criterion="entropy", random_state=100, max_depth=3, min_samples_leaf=5)
clf_entropy.fit(X_train, y_train)
y_pred = clf_entropy.predict(X_test)
print("Entropy Predicted values:")
print(y_pred)
print("Entropy Accuracy: ", accuracy_score(y_test, y_pred) * 100)

# User Test (DOES NOT WORK)
xx = "present   JJ  peculiar    JJ  %%  %%  written VBN character   NN"
x = xx.split("\t")
data = pd.Series(x)
print(x)
print(data)
data = pd.get_dummies(data)
print(data)

user = clf_gini.predict(data)

Любые предложения или помощь по коду были бы хороши!

1 Ответ

0 голосов
/ 18 февраля 2019

Вы действительно используете FeatureHasher, который вы определили?Кроме того, я не уверен, почему вы используете строчные буквы x и y в train_test_split, когда определяете его заглавными буквами раньше.

Относительно проблемы вашего пользовательского ввода.Вы применяете горячее кодирование только к вашим данным, что приводит к дополнительной функции для каждого уникального значения в ваших категориальных функциях.Когда у вас есть пользовательские данные, у вас есть только одно уникальное значение в ваших категориальных функциях, и вы применяете дополнительное горячее кодирование, что приводит только к одному горячему кодированию.Поэтому вы должны вызывать get_dummies () для объединенных данных, чтобы убедиться, что кодировка совпадает.

Однако я не думаю, что одноразовое кодирование является хорошим выбором, поскольку кажется, что ваши категориальные функции содержат много уникальныхзначения, приводящие к очень большому количеству признаков (11823).Поэтому вы можете подумать об использовании OrdinalEncoder, например, из scikit-learn

Если вы не хотите / или не можете объединить ввод пользователя и ваши известные данные, подумайте о добавлении дополнительной кодировкидля «неизвестных» значений.

...