【问题标题】:How do you feed 'str' data to decision tree without one-hot encoding如何在没有 one-hot 编码的情况下将“str”数据提供给决策树
【发布时间】:2019-07-11 18:22:04
【问题描述】:

我正在研究语言数据以训练分类器(决策树)。数据为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 值。为了解决这个问题,我使用 one-hot 编码器对数据进行了编码,它在 80,20 分割的数据上运行良好。

当我给它一个没有标签的用户输入时,真正的问题就出现了。我将输入转换为 one-hot 编码数据并将其传递给预测器。 它给了我一个值错误,说特征的数量不是 man_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)

任何建议或代码帮助都会很棒!

【问题讨论】:

  • 尝试使用随机森林,这样每个估计器只考虑一小部分特征

标签: python parsing decision-tree


【解决方案1】:

你真的使用你定义的 FeatureHasher 吗?另外,我不确定为什么在之前用大写字母定义 train_test_split 时使用小写 x 和 y。

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

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

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

【讨论】:

  • 我尝试使用 FeatureHeader 但它对我不起作用。它适用于我猜的字典数据。能否提供代码 sn-p?
  • 您的问题是您将用户数据与训练/测试数据分开编码。这会导致特征数量不同,并且您的用户数据无法分类。您可以在 scikit-learn 上找到代码 sn-ps 以了解如何使用编码器 请同时删除未使用的代码部分,下次。
猜你喜欢
  • 2018-06-27
  • 2017-02-24
  • 2018-08-25
  • 2018-03-24
  • 2017-11-06
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 2023-02-04
相关资源
最近更新 更多