机器学习 - 预处理 - 分类数据
分类数据
当您的数据包含由字符串表示的类别时,将很难使用它们来训练通常仅接受数值数据的机器学习模型。
与其忽略分类数据并从模型中排除这些信息,您可以转换数据以便在模型中使用。
查看下面的表格,它是我们在多元回归章节中使用的相同数据集。
实例
import pandas as pd cars = pd.read_csv('data.csv') print(cars.to_string())
结果:
Car Model Volume Weight CO2 0 Toyoty Aygo 1000 790 99 1 Mitsubishi Space Star 1200 1160 95 2 Skoda Citigo 1000 929 95 3 Fiat 500 900 865 90 4 Mini Cooper 1500 1140 105 5 VW Up! 1000 929 105 6 Skoda Fabia 1400 1109 90 7 Mercedes A-Class 1500 1365 92 8 Ford Fiesta 1500 1112 98 9 Audi A1 1600 1150 99 10 Hyundai I20 1100 980 99 11 Suzuki Swift 1300 990 101 12 Ford Fiesta 1000 1112 99 13 Honda Civic 1600 1252 94 14 Hundai I30 1600 1326 97 15 Opel Astra 1600 1330 97 16 BMW 1 1600 1365 99 17 Mazda 3 2200 1280 104 18 Skoda Rapid 1600 1119 104 19 Ford Focus 2000 1328 105 20 Ford Mondeo 1600 1584 94 21 Opel Insignia 2000 1428 99 22 Mercedes C-Class 2100 1365 99 23 Skoda Octavia 1600 1415 99 24 Volvo S60 2000 1415 99 25 Mercedes CLA 1500 1465 102 26 Audi A4 2000 1490 104 27 Audi A6 2000 1725 114 28 Volvo V70 1600 1523 109 29 BMW 5 2000 1705 114 30 Mercedes E-Class 2100 1605 115 31 Volvo XC70 2000 1746 117 32 Ford B-Max 1600 1235 104 33 BMW 216 1600 1390 108 34 Opel Zafira 1600 1405 109 35 Mercedes SLK 2500 1395 120
在多元回归章节中,我们试图基于发动机的体积和汽车的重量来预测二氧化碳排放量,但我们排除了有关汽车品牌和型号的信息。
关于汽车品牌或型号的信息可能会帮助我们更好地预测二氧化碳排放量。
独热编码
由于 Car 或 Model 列不是数值,因此我们不能在数据中使用它们。无法确定分类变量(如 Car 或 Model)与数值变量(如 CO2)之间的线性关系。
为了解决这个问题,我们必须对分类变量进行数值表示。一种方法是为类别中的每个组创建一个列。
对于每列,值将为 1 或 0,其中 1 表示包含该组,0 表示排除该组。这种转换称为独热编码。
您无需手动执行此操作,Python Pandas 模块有一个名为 get_dummies()
的函数,它执行独热编码。
在我们的 Pandas 教程 中了解 Pandas 模块。
实例
对 Car
列进行独热编码:
import pandas as pd cars = pd.read_csv('data.csv') ohe_cars = pd.get_dummies(cars[['Car']]) print(ohe_cars.to_string())
结果:
Car_Audi Car_BMW Car_Fiat Car_Ford Car_Honda Car_Hundai Car_Hyundai Car_Mazda Car_Mercedes Car_Mini Car_Mitsubishi Car_Opel Car_Skoda Car_Suzuki Car_Toyoty Car_VW Car_Volvo 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 7 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 8 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 12 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 15 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 18 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 19 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 22 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 23 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 25 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 26 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 32 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 33 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 35 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
结果:
输出将显示每个汽车品牌作为一列,其中包含 1 和 0 的值。
预测二氧化碳排放量
我们可以使用这些附加信息以及体积(排量)和重量来预测二氧化碳排放量。
为了结合这些信息,我们可以使用 pandas 的 concat()
函数。
首先,我们需要导入一些模块。
我们将从导入 Pandas 开始。
import pandas
pandas 模块允许我们读取 csv 文件并操作 DataFrame 对象:
cars = pandas.read_csv("data.csv")
它还允许我们创建虚拟变量:
ohe_cars = pandas.get_dummies(cars[['Car']])
然后,我们必须选择自变量(X)并将虚拟变量按列添加。
还将因变量存储在 y 中。
X = pandas.concat([cars[['Volume', 'Weight']], ohe_cars], axis=1) y = cars['CO2']
我们还需要从 sklearn
导入一个方法来创建线性模型。
了解线性回归。
from sklearn import linear_model
现在,我们可以将数据拟合到线性回归模型:
regr = linear_model.LinearRegression() regr.fit(X,y)
最后,我们可以根据汽车的重量、排量和制造商来预测二氧化碳排放量。
## 预测一辆重量为 2300kg、排量为 1300cm³ 的沃尔沃汽车的二氧化碳排放量: predictedCO2 = regr.predict([[2300, 1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]])
实例
import pandas from sklearn import linear_model cars = pandas.read_csv("data.csv") ohe_cars = pandas.get_dummies(cars[['Car']]) X = pandas.concat([cars[['Volume', 'Weight']], ohe_cars], axis=1) y = cars['CO2'] regr = linear_model.LinearRegression() regr.fit(X,y) ## 预测一辆重量为 2300kg、排量为 1300cm³ 的沃尔沃汽车的二氧化碳排放量: predictedCO2 = regr.predict([[2300, 1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]]) print(predictedCO2)
Result
[122.45153299]
我们现在有了数据集中体积、排量和每个汽车品牌的系数。
虚拟化
不必为您的类别中的每个组都创建一列。可以使用比您拥有的组数少一列的信息来表示。
例如,您有一个表示颜色的列,在该列中,您有两种颜色,红色和蓝色。
实例
import pandas as pd colors = pd.DataFrame({'color': ['blue', 'red']}) print(colors)
结果:
color 0 blue 1 red
您可以创建一列名为 red,其中 1 表示红色,0 表示不是红色(即蓝色)。
为此,我们可以使用与独热编码相同的函数 get_dummies
,然后删除其中一列。有一个参数 drop_first
,它允许我们从结果表中排除第一列。
实例
import pandas as pd colors = pd.DataFrame({'color': ['blue', 'red']}) dummies = pd.get_dummies(colors, drop_first=True) print(dummies)
结果:
color_red 0 0 1 1
如果您有超过 2 个组怎么办?多个组如何仅用少一列来表示?
假设我们这次有三种颜色,红色、蓝色和绿色。当我们执行 get_dummies
同时删除第一列时,我们得到以下表格。
实例
import pandas as pd colors = pd.DataFrame({'color': ['blue', 'red', 'green']}) dummies = pd.get_dummies(colors, drop_first=True) dummies['color'] = colors['color'] print(dummies)
结果:
color_green color_red color 0 0 0 blue 1 0 1 red 2 1 0 green