到目前为止,我们一直假设数据是由浮点数组成的二维数组,其中每一列是描述数据点的连续特征(continuous feature)。对于许多应用而言,数据的收集方式并不是这样。一种特别常见的特征类型就是分类特征(categorical feature),也叫离散特征(discrete feature)。这种特征通常并不是数值。分类特征与连续特征之间的区别类似于分类和回归之间的区别,只是前者在输入端而不是输出端。我们已经见过的连续特征的例子包括像素明暗程度和花的尺寸测量。分类特征的例子包括产品的品牌、产品的颜色或产品的销售部门
分类变量
作为例子,我们将使用美国成年人收入的数据集,该数据集是从 1994 年的普查数据库中导出的。 adult 数据集的任务是预测一名工人的收入是高于 50 000 美元还是低于 50 000 美元。这个数据集的特征包括工人的年龄、雇用方式(独立经营、私营企业员工、政府职员等)、教育水平、性别、每周工作时长、职业,等等。表 4-1 给出了该数据集中的前几个条目。
age | wrokclass | education | gender | hours-per-week | occupation | icome |
---|---|---|---|---|---|---|
39 | State-gov | Bachelors | Male | 40 | Adm-clerical | <=50K |
50 | Self-emp-not-inc | Bachelors | Male | 13 | Exec-managerial | <=50K |
38 | Private | Hs-grade | Male | 40 | Handler-cleaners | <=50K |
53 | Private | 11th | Male | 40 | Handler-cleaners | <=50K |
28 | Private | Bachelors | Female | 40 | Prof-specialty | <=50K |
37 | Private | Master | Female | 40 | Exec-managerial | <=50K |
49 | Private | 9th | Female | 16 | Other-service | <=50K |
52 | self-emp-not0ic | HS-grad | Male | 45 | Exec-managerial | >50K |
31 | Private | Master | Female | 50 | Prof-specialty | >50 |
42 | Private | Bachelors | Male | 40 | Exec-managerial | >50 |
37 | Private | Some-college | Male | 80 | Exec-managerial | >50K |
在这个数据集中,age和hour-per-week是连续特征,我们知道怎样处理这样的特征,但是 workclass 和 education 以及gender、occupation 都是分类特征,他们都取一系列固定的可能的值,下面我们来学习如何在机器学习中来使用分类特征
One-Hot 编码(虚拟变量)
表示分类变量最常用的办法是使用ont-hot编码,也叫做虚拟变量(dummy variable)。虚拟变量背后的思想是将一个分类变量替换为一个或者多个新特征,新特征取值为0和1。比如说workclass特征的可能取值包括 Government Private ,Employee, Self Employed 和Self Employed Incorporated,为了编码这4个可能的取值,我们创建了4个新特征,分别叫做 Government Private ,Employee, Self Employed 和Self Employed Incorporated,如果一个人的workclass取某个值,那么对应的特征值为1
workclass | Government Employee | Pirvate Employee | Self Employed | Self Employed Incorporated |
---|---|---|---|---|
Government Employee | 1 | 0 | 0 | 0 |
Pirvate Employee | 0 | 1 | 0 | 0 |
Self Employed | 0 | 0 | 1 | 0 |
Self Employed Incorporated | 0 | 0 | 0 | 1 |
我们使用的 one-hot 编码与统计学中使用的虚拟编码(dummy encoding)非
常相似,但并不完全相同。为简单起见,我们将每个类别编码为不同的二元
特征。在统计学中,通常将具有 k 个可能取值的分类特征编码为 k-1 个特征
(都等于零表示最后一个可能取值)。这么做是为了简化分析(更专业的说法
是,这可以避免使数据矩阵秩亏)
使用pandas进行One-Hot编码
这里我们使用pandas进行one-hot编码,sklearn的one-hot编码前面已经提到过
import pandas as pd
from IPython.display import display
# 文件中没有包含列名称的表头,因此我们传入header=None
# 然后在"names"中显式地提供列名称
data = pd.read_csv(
"dataset/housing.csv", index_col=False)
# 为了便于说明,我们只选了其中几列
# IPython.display可以在Jupyter notebook中输出漂亮的格式
display(data.head())
输出如下
longitude | latitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | median_house_value | ocean_proximity |
---|---|---|---|---|---|---|---|---|---|
0 | -122.23 | 37.88 | 41.0 880.0 | 129.0 | 322.0 | 126.0 | 8.3252 | 452600.0 NEAR BAY | |
1 | -122.22 | 37.86 | 21.0 7099.0 | 1106.0 | 2401.0 | 1138.0 | 8.3014 | 358500.0 NEAR BAY | |
2 | -122.24 | 37.85 | 52.0 1467.0 | 190.0 | 496.0 | 177.0 | 7.2574 | 352100.0 NEAR BAY | |
3 | -122.25 | 37.85 | 52.0 1274.0 | 235.0 | 558.0 | 219.0 | 5.6431 | 341300.0 NEAR BAY | |
4 | -122.25 | 37.85 | 52.0 1627.0 | 280.0 | 565.0 | 259.0 | 3.8462 | 342200.0 NEAR BAY |
我们可以看出最后一列为文本类数据,我们来查看该数据的值
<1H OCEAN 9136
INLAND 6551
NEAR OCEAN 2658
NEAR BAY 2290
ISLAND 5
Name: ocean_proximity, dtype: int64
我们看出该属性有5个值,这里我们使用pandas的get_dummies函数自动变换具有分类类型的列
dummy_data = pd.get_dummies(data)
print(dummy_data.columns)
得到的输出为
Index(['longitude', 'latitude', 'housing_median_age', 'total_rooms',
'total_bedrooms', 'population', 'households', 'median_income',
'median_house_value', 'ocean_proximity_<1H OCEAN',
'ocean_proximity_INLAND', 'ocean_proximity_ISLAND',
'ocean_proximity_NEAR BAY', 'ocean_proximity_NEAR OCEAN'],
dtype='object')
我们可以看到分类特征ocean_proximity
发生了变化,分类特征每个可鞥取值都被扩展为一个新的特征值
网友评论