簡體   English   中英

如何在沒有單熱編碼的情況下將“str”數據提供給決策樹

[英]How do you feed 'str' data to decision tree without one-hot encoding

我正在研究語言數據以訓練分類器(決策樹)。 數據為 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)

任何建議或代碼幫助都會很棒!

你真的使用你定義的 FeatureHasher 嗎? 另外,我不確定為什么在 train_test_split 之前用大寫字母定義它時使用小寫 x 和 y 。

關於您的用戶輸入問題。 您僅對給定數據應用單熱編碼,這會為分類特征中的每個唯一值生成一個額外特征。 當您擁有用戶數據時,您的分類特征中只有一個唯一值,並應用額外的 one-hot-encoding 導致只有一個 one-hot-encoded 特征。 因此,您應該對組合數據調用 get_dummies() 以確保編碼匹配。

但是,我不認為 one-hot-encoding 在這里是一個不錯的選擇,因為您的分類特征似乎包含許多唯一值,從而導致大量特征(11823)。 所以你可能會考慮使用 OrdinalEncoder,例如來自scikit-learn

當您不想/或無法組合用戶輸入和已知數據時,請考慮為“未知”值添加額外的編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM