我是这个领域的初学者,
我有一个分类问题,我的数据如下所示:
结果列是依赖变量。数据中没有任何有序的部分。(名称列有36个不同的名字。)
由于这是分类数据,我尝试了OneHotEncoding
,但得到了ValueError: Number of features of the model must match the input
我理解了这个问题并参考了这个:StackOverflow问题,问题得到了解决。
还有另一个网站:Medium,通过使用Pandas的factorize
函数来解决这个ValueError
问题。
我的问题是:
- 正确的处理方法是什么?我应该先
factorize
然后再应用OneHotEncoding
吗? - 还是因为我的数据不是有序的,我不应该使用
factorize
? - 我总是得到100%的准确率。这是由于我做的编码造成的吗?
我的代码如下:
训练
# -*- coding: utf-8 -*-import numpy as npimport pandas as pddataset = pd.read_csv("model_data.csv")dataset['Col1'] = pd.factorize(dataset['Col1'])[0]dataset['Col2'] = pd.factorize(dataset['Col2'])[0]dataset['name'] = pd.factorize(dataset['name'])[0]dataset['ID'] = pd.factorize(dataset['ID'])[0]X = dataset.iloc[:, 0:-1].valuesy = dataset.iloc[:, -1].values# Encoding# Encoding categorical data# Encoding the Independent Variablefrom sklearn.compose import make_column_transformerfrom sklearn.preprocessing import OneHotEncoderct = make_column_transformer((OneHotEncoder(sparse='False'), [0,1,2,3]), remainder = 'passthrough')X = ct.fit_transform(X)# Encoding the Dependent Variablefrom sklearn.preprocessing import LabelEncoderle = LabelEncoder()y = le.fit_transform(y)print(y)#from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)from sklearn.ensemble import RandomForestClassifierclassifier = RandomForestClassifier(n_estimators = 5, criterion = 'entropy', max_depth = 5, random_state = 0)classifier.fit(X_train, y_train)# Predicting the Test set resultsy_pred = classifier.predict(X_test)
测试
test_data_set = pd.read_csv("test_data.csv")test_data_set['Col1'] = pd.factorize(test_data_set['Col1'])[0]test_data_set['Col2'] = pd.factorize(test_data_set['Col2'])[0]test_data_set['name'] = pd.factorize(test_data_set['name'])[0]test_data_set['ID'] = pd.factorize(test_data_set['ID'])[0]X_test_data = test_data_set.iloc[:, 0:-1].valuesy_test_data = test_data_set.iloc[:, -1].valuesy_test_data = le.transform(y_test_data)classifier.fit(X_test_data, y_test_data) #fixes ValueErrory_test_pred = classifier.predict(X_test_data)from sklearn.metrics import confusion_matrix, accuracy_scorecm = confusion_matrix(y_test_data, y_test_pred)print(cm)print(accuracy_score(y_test_data, y_test_pred))
编辑:
- 我的数据集中有2000行。
- 结果
accuracy_score
是1.0
混淆矩阵
[[113 0] [ 0 30]]
我不确定我有大约2000行,但我的TP和TN加起来只有143个计数。
回答:
这里是一个如何对你的数据使用OneHotEncoding来进行二元分类的例子。
你首先对所有特征列使用one-hot-encoding,然后将“Result”列中的Y/N类别转换为1/0视图。
dataset = pd.read_csv("model_data.csv")dataset = pd.get_dummies(dataset , columns=['Col1', 'Col2', 'name', 'ID'])dataset.Result = pd.factorize(dataset.Result)[0]
你应该会在你的结果数据框中得到如下的结果,你可以用它来进行训练/测试步骤。
初始数据框:
Col1 Col2 name ID Result0 AB A John -2500 N1 AB A John -2500 N2 A A John -2500 N3 A A Jacob -2500 Y4 A A Micheal -2500 Y5 A AB John -2500 N6 A A Sheldon -2500 Y7 AB AB Sheldon -2500 N8 AB AB Jacob -2500 Y
结果数据框:
Result Col1_A Col1_AB Col2_A Col2_AB name_Jacob name_John name_Micheal name_Sheldon ID_-25000 0 0 1 1 0 0 1 0 0 11 0 0 1 1 0 0 1 0 0 12 0 1 0 1 0 0 1 0 0 13 1 1 0 1 0 1 0 0 0 14 1 1 0 1 0 0 0 1 0 15 0 1 0 0 1 0 1 0 0 16 1 1 0 1 0 0 0 0 1 17 0 0 1 0 1 0 0 0 1 18 1 0 1 0 1 1 0 0 0 1
希望这对你有帮助。