美文网首页
第十九天 One-Hot编码

第十九天 One-Hot编码

作者: 未不明不知不觉 | 来源:发表于2019-01-07 10:37 被阅读15次

    到目前为止,我们一直假设数据是由浮点数组成的二维数组,其中每一列是描述数据点的连续特征(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 EmployedSelf Employed Incorporated,为了编码这4个可能的取值,我们创建了4个新特征,分别叫做 Government Private ,Employee, Self EmployedSelf 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发生了变化,分类特征每个可鞥取值都被扩展为一个新的特征值

    相关文章

      网友评论

          本文标题:第十九天 One-Hot编码

          本文链接:https://www.haomeiwen.com/subject/ocwyrqtx.html