预处理 - 类别型数据
在本页,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”之间的线性关系。
为了解决这个问题,我们需要对分类变量进行数值化表示。一种方法是创建一个代表类别中每个组的列。
对于每一列,值将是 1 或 0,其中 1 代表该组的包含,0 代表该组的排除。这种转换称为独热编码。
您不必手动执行此操作,Python Pandas 模块有一个名为get_dummies()
的函数,可以执行独热编码。
在我们的Pandas 教程中了解 Pandas 模块。
示例
对“汽车”列进行独热编码
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
运行示例 »
结果
为“汽车”列中的每个汽车品牌创建了一个列。
预测 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 排放量。
## 预测一辆重量为 2300 公斤、体积为 1300 立方厘米的沃尔沃的 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)
## 预测一辆重量为 2300 公斤、体积为 1300 立方厘米的沃尔沃的 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]
运行示例 »
现在,我们有了体积、重量和数据集中每个汽车品牌的系数
虚拟化
没有必要为类别中的每个组创建一个列。可以使用比组数少 1 列的信息。
例如,您有一列代表颜色,该列中有两种颜色,红色和蓝色。
示例
import pandas as pd
colors = pd.DataFrame({'color': ['blue', 'red']})
print(colors)
结果
color 0 blue 1 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
运行示例 »