首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ML分类:编码分类数据

ML分类:编码分类数据
EN

Stack Overflow用户
提问于 2020-09-02 04:43:39
回答 2查看 539关注 0票数 1

我是这方面的初学者

我有一个分类问题,我的数据如下:

等等..。

结果列是因变量。所有的数据都不是Ordinal。(Name列有36个不同的名称。)

因为这是分类数据,我尝试了OneHotEncoding,我得到了ValueError: Number of features of the model must match the input

我理解并提到:所以问题和它被修复了。

还有另一个站点:5~6成熟通过使用Pandas factorize函数来解决这个ValueError

我的问题是:

  1. 什么是正确的方法来处理这个问题?我应该factorize和应用OneHotEncoding吗?
  2. 或者因为我的数据不是普通的,所以我不应该使用因式分解?
  3. 我总是得到100%的准确性。是因为我做的编码吗?

我的代码如下:

训练

代码语言:javascript
复制
# -*- coding: utf-8 -*-

import numpy as np

import pandas as pd
dataset = 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].values
y = dataset.iloc[:, -1].values

# Encoding
# Encoding categorical data
# Encoding the Independent Variable
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import OneHotEncoder

ct = make_column_transformer((OneHotEncoder(sparse='False'), [0,1,2,3]),  remainder = 'passthrough')
X = ct.fit_transform(X)


# Encoding the Dependent Variable
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
print(y)

#
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)



from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators = 5, criterion = 'entropy', max_depth = 5, random_state = 0)
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

测试

代码语言:javascript
复制
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].values
y_test_data = test_data_set.iloc[:, -1].values


y_test_data = le.transform(y_test_data)


classifier.fit(X_test_data, y_test_data) #fixes ValueError
y_test_pred = classifier.predict(X_test_data)

from sklearn.metrics import confusion_matrix, accuracy_score
cm = confusion_matrix(y_test_data, y_test_pred)
print(cm)
print(accuracy_score(y_test_data, y_test_pred))

编辑

  • 我的数据集中的行数是2000。
  • 结果accuracy_score为1.0

混淆矩阵

代码语言:javascript
复制
[[113   0]

 [  0  30]] 

我不确定我有大约2000行,但我的TP和TN总共只有143行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-02 06:32:37

下面是如何对数据使用OneHotEncoding来执行二进制分类的示例。

首先对所有具有功能的列使用一次热编码,然后将Y/N类分解为“结果”列中的1/0视图。

代码语言:javascript
复制
dataset = pd.read_csv("model_data.csv")

dataset = pd.get_dummies(dataset , columns=['Col1', 'Col2', 'name', 'ID'])
dataset.Result = pd.factorize(dataset.Result)[0]

您应该得到的结果如下所示,在您的结果数据,您可以使用您的培训/测试步骤。

初步数据:

代码语言:javascript
复制
  Col1 Col2     name    ID Result
0   AB    A     John -2500      N
1   AB    A     John -2500      N
2    A    A     John -2500      N
3    A    A    Jacob -2500      Y
4    A    A  Micheal -2500      Y
5    A   AB     John -2500      N
6    A    A  Sheldon -2500      Y
7   AB   AB  Sheldon -2500      N
8   AB   AB    Jacob -2500      Y

由此产生的数据文件:

代码语言:javascript
复制
   Result  Col1_A  Col1_AB  Col2_A  Col2_AB  name_Jacob  name_John  name_Micheal  name_Sheldon  ID_-2500
0       0       0        1       1        0           0          1             0             0         1
1       0       0        1       1        0           0          1             0             0         1
2       0       1        0       1        0           0          1             0             0         1
3       1       1        0       1        0           1          0             0             0         1
4       1       1        0       1        0           0          0             1             0         1
5       0       1        0       0        1           0          1             0             0         1
6       1       1        0       1        0           0          0             0             1         1
7       0       0        1       0        1           0          0             0             1         1
8       1       0        1       0        1           1          0             0             0         1

希望它能帮到你。

票数 2
EN

Stack Overflow用户

发布于 2020-09-02 06:15:34

您可以使用pd.get_dummies()方法,它通常非常可靠。本指南应该能让你开始工作。干杯!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63698832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档