在此页面上,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
在“汽车”栏目中为每个汽车品牌创建了一个栏目。
我们可以使用这些附加信息以及体积和重量来预测二氧化碳
为了合并信息,我们可以使用concat()
来自 pandas 的函数。
首先我们需要导入几个模块。
我们将从Import Panda开始。
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)
最后,我们可以根据汽车的重量、体积和制造商来预测二氧化碳排放量。
##predict the CO2 emission of a Volvo where the weight is 2300kg, and the volume is 1300cm3:
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)
##predict the CO2 emission of a Volvo where the weight is 2300kg, and the volume is 1300cm3:
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 个名为红色的列,其中 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