我正在研究语言数据来训练分类器(决策树)。数据采用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```
决策树给出错误,因为它期望要素是int或float值。为了解决这个问题,我用一个热编码器对数据进行了编码,它在80,20中分割的数据上工作正常。
当我给它一个没有标签的用户输入时,会出现真正的问题。我将输入转换为单热编码数据并将其传递给预测器。它给出了一个值错误,表示功能的数量不是n nfefefe是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)
任何建议或代码帮助都会很棒!
你真的使用你定义的FeatureHasher吗?另外,我不确定为什么在以大写字母定义之前在train_test_split中使用小写的x和y。
关于用户输入的问题。您仅对给定数据应用单热编码,这会为分类要素中的每个唯一值生成额外的功能。获得用户数据后,分类功能中只有一个唯一值,并应用额外的单热编码,这样只会产生一个热编码功能。因此,您应该对组合数据调用get_dummies()以确保编码匹配。
但是,我不认为单热编码在这里是一个不错的选择,因为您的分类特征似乎包含许多独特的值,从而产生了大量的特征(11823)。所以你可能会考虑使用OrdinalEncoder,例如来自scikit-learn
如果您不想/或不能将用户输入和已知数据组合在一起,请考虑为“未知”值添加额外的编码。