[英]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```
決策樹給出錯誤,因為它期望特征是 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.