机器学习 - 预处理 - 分类数据

分类数据

当您的数据包含由字符串表示的类别时,将很难使用它们来训练通常仅接受数值数据的机器学习模型。

与其忽略分类数据并从模型中排除这些信息,您可以转换数据以便在模型中使用。

查看下面的表格,它是我们在多元回归章节中使用的相同数据集。

实例

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