首页 > 解决方案 > 如何自动将大量分类数据从字符串转换为数值?

问题描述

我正在尝试建立一个决策树回归来预测汽车的 MSRP(制造商建议零售价)的值。但是,我在将分类值转换为数值时遇到了问题。

我的问题:我有 8 列分类特征,有些列有多达 40 种不同类型的唯一值和 20,000 个实例。我应该使用什么方法来转换分类数据以用于决策树回归?有没有办法自动输入唯一值而不是手动输入?

我尝试使用 LabelEncoder 转换分类值,但由于某种原因,第一列中 df.values (BMW,Acura ...) 的数组即使在我转换后也没有改变。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline 
df = pd.read_excel(r'C:\Users\user\Desktop\data.xlsx')
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
df.values[:, 0] = labelencoder.fit_transform(df.values[:, 0])

这是我得到的结果:

array([['BMW', '1 Series M', 2011, ..., 19, 3916, 46135],
       ['BMW', '1 Series', 2011, ..., 19, 3916, 40650],
       ['BMW', '1 Series', 2011, ..., 20, 3916, 36350],
       ...,
       ['Acura', 'ZDX', 2012, ..., 16, 204, 50620],
       ['Acura', 'ZDX', 2013, ..., 16, 204, 50920],
       ['Lincoln', 'Zephyr', 2006, ..., 17, 61, 28995]], dtype=object)

我希望第一列是用于 DT 回归的数值。任何人都可以帮忙吗?我在我的 FYP 中这样做,这是我第一次接近机器学习。

标签: pythonmachine-learningdecision-tree

解决方案


有多种方法可以使用 pandas 和 sklearn 将分类数据转换为数字:

  1. pandas.get_dummies() (一种热编码)
    示例:
import numpy as np
import pandas as pd

df = pd.DataFrame([['BMW', '1 Series M', 2011, 19, 3916, 46135],
       ['BMW', '1 Series', 2011,19, 3916, 40650],
       ['BMW', '1 Series', 2011,20, 3916, 36350],
       ['Acura', 'ZDX', 2012, 16, 204, 50620],
       ['Acura', 'ZDX', 2013, 16, 204, 50920],
       ['Lincoln', 'Zephyr', 2006, 17, 61, 28995]]) #Sample dataframe

pd.get_dummies(df, columns = [0,1,2]) #Dummies of 1st,2nd and 3rd column

输出
输出

2. LabelEncoder
示例

import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame([['BMW', '1 Series M', 2011, 19, 3916, 46135],
       ['BMW', '1 Series', 2011,19, 3916, 40650],
       ['BMW', '1 Series', 2011,20, 3916, 36350],
       ['Acura', 'ZDX', 2012, 16, 204, 50620],
       ['Acura', 'ZDX', 2013, 16, 204, 50920],
       ['Lincoln', 'Zephyr', 2006, 17, 61, 28995]]) #Sample dataframe

df[[0,1,2]].apply(LabelEncoder().fit_transform)

输出(它只会给出需要与原始数据框组合的转换列) 在此处输入图像描述

df.loc[0:,0:2] = df[[0,1,2]].apply(LabelEncoder().fit_transform) 
#puts column back into dataframe

输出 在此处输入图像描述


推荐阅读