如何在没有单热编码的情况下将'str'数据提供给决策树

问题描述 投票:0回答:1

我正在研究语言数据来训练分类器(决策树)。数据采用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 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)

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

python parsing decision-tree
1个回答
0
投票

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

关于用户输入的问题。您仅对给定数据应用单热编码,这会为分类要素中的每个唯一值生成额外的功能。获得用户数据后,分类功能中只有一个唯一值,并应用额外的单热编码,这样只会产生一个热编码功能。因此,您应该对组合数据调用get_dummies()以确保编码匹配。

但是,我不认为单热编码在这里是一个不错的选择,因为您的分类特征似乎包含许多独特的值,从而产生了大量的特征(11823)。所以你可能会考虑使用OrdinalEncoder,例如来自scikit-learn

如果您不想/或不能将用户输入和已知数据组合在一起,请考虑为“未知”值添加额外的编码。

© www.soinside.com 2019 - 2024. All rights reserved.