预处理 - 类别数据
在此页面上,W3schools.com 与 纽约数据科学学院 合作,为我们的学生提供数字培训内容。
类别数据
当你的数据包含由字符串表示的类别时,将很难使用它们来训练通常只接受数字数据的机器学习模型。
与其忽略类别数据并将其信息排除在模型之外,不如转换数据,使其可以在你的模型中使用。
请看下表,这是我们在多元回归章节中使用过的相同数据集。
示例
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
运行示例 »
在多元回归章节中,我们试图根据发动机的排量和汽车的重量来预测排放的 CO2,但我们排除了有关汽车品牌和型号的信息。
有关汽车品牌或汽车型号的信息可能会帮助我们更准确地预测排放的 CO2。
广告
独热编码 (One Hot Encoding)
由于“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
运行示例 »
结果
为“Car”列中的每个汽车品牌创建了一个列。
预测 CO2
除了排量和重量之外,我们还可以利用这些额外的信息来预测 CO2。
要合并这些信息,我们可以使用 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)
最后,我们可以根据汽车的重量、排量和制造商来预测 CO2 排放量。
## 预测一辆重量为 2300kg,排量为 1300cm3 的沃尔沃汽车的 CO2 排放量
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,排量为 1300cm3 的沃尔沃汽车的 CO2 排放量
predictedCO2 = regr.predict([[2300, 1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]])
print(predictedCO2)
结果
[122.45153299]
运行示例 »
现在我们有了排量、重量以及数据集中每个汽车品牌的系数。
哑变量化 (Dummifying)
不一定需要为类别中的每个组创建一个列。可以使用比组数少 1 列的信息。
例如,你有一个表示颜色的列,该列中有两种颜色:红色和蓝色。
示例
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 个组怎么办?如何用少 1 列来表示多个组?
假设我们这次有三种颜色:红色、蓝色和绿色。当我们使用 `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
运行示例 »