如何在不进行一键编码的情况下将“ str”数据馈送到决策树

时间:2019-02-18 11:17:11

标签: python parsing decision-tree

我正在处理语言数据,以训练分类器(决策树)。数据采用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或float值。为解决此问题,我使用单热编码器对数据进行了编码,并且对分割为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 :(得分:0)

您实际上使用了您定义的FeatureHasher吗?另外,我不确定在为什么使用大写字母定义train_test_split时为什么在小写的x和y中使用小写字母。

关于用户输入的问题。您仅对给定数据应用单次热编码,这会为分类特征中的每个唯一值产生额外的特征。当您拥有用户数据时,分类功能中只有一个唯一值,并且应用了额外的一键编码,这只会导致一个一键编码的功能。因此,您应该在合并后的数据上调用get_dummies(),以确保编码匹配。

但是,我认为单编码不是一个好的选择,因为您的分类特征似乎包含许多唯一值,导致大量特征(11823)。因此,您可能会考虑使用OrdinalEncoder,例如来自scikit-learn

当您不想/或无法将用户输入和已知数据结合在一起时,可以考虑为“未知”值添加额外的编码。