那个网站专门做二手衣服的,lol英雄介绍网站模板,ui设计师做网站,太原住房和城乡建设部网站来源#xff1a;Unsplash#xff0c;作者#xff1a;an Rizzari2019 年第 78 篇文章#xff0c;总第 102 篇文章目录#xff1a;问题描述数据准备标签编码自定义二分类one-hot 编码总结问题描述一般特征可以分为两类特征#xff0c;连续型和离散型特征#xff0c;而离散… 来源Unsplash作者an Rizzari2019 年第 78 篇文章总第 102 篇文章目录问题描述数据准备标签编码自定义二分类one-hot 编码总结问题描述一般特征可以分为两类特征连续型和离散型特征而离散型特征既有是数值型的也有是类别型特征也可以说是字符型比如说性别是男还是女职业可以是程序员产品经理教师等等。本文将主要介绍一些处理这种类别型特征的方法分别来自 pandas 和 sklearn 两个常用的 python 库给出的解决方法这些方法也并非是处理这类特征的唯一答案通常都需要具体问题具体分析。数据准备参考文章https://mlln.cn/2018/09/18/pandas%E6%96%87%E6%9C%AC%E6%95%B0%E6%8D%AE%E8%BD%AC%E6%95%B4%E6%95%B0%E5%88%86%E7%B1%BB%E7%BC%96%E7%A0%81%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/采用 UCI 机器学习库的一个汽车数据集它包括类别型特征和连续型特征首先是简单可视化这个数据集的部分样本并简单进行处理。首先导入这次需要用到的 python 库import pandas as pd
import numpy as np
import pandas_profiling
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import LabelEncoder, OneHotEncoder接着加载数据# 定义数据的列名称, 因为这个数据集没有包含列名称
headers [symboling, normalized_losses, make, fuel_type, aspiration, num_doors, body_style, drive_wheels, engine_location, wheel_base, length, width, height, curb_weight, engine_type, num_cylinders, engine_size, fuel_system, bore, stroke, compression_ratio, horsepower, peak_rpm, city_mpg, highway_mpg, price] # 读取在线的数据集, 并将?转换为缺失NaN
df pd.read_csv(http://mlr.cs.umass.edu/ml/machine-learning-databases/autos/imports-85.data, headerNone, namesheaders, na_values? )
df.head()[df.columns[:10]]展示的前 10 列的 5 行数据结果如下这里介绍一个新的数据分析库--pandas_profiling这个库可以帮我们先对数据集做一个数据分析报告报告的内容包括说明数据集包含的列数量、样本数量每列的缺失值数量每列之间的相关性等等。安装方法也很简单pip install pandas_profiling使用方法也很简单用 pandas读取数据后直接输入下列代码df.profile_report()显示的结果如下概览如下所示看右上角可以选择有 5 项内容下面是概览的内容主要展示数据集的样本数量特征数量列的数量、占用内存、每列的数据类型统计、缺失值情况等这是一个很有用的工具可以让我们对数据集有一个初步的了解更多用法可以去查看其 github 上了解https://github.com/pandas-profiling/pandas-profiling加载数据后这里我们仅关注类别型特征也就是 object 类型的特征这里可以有两种方法来获取方法1:采用 pandas 提供的方法 select_dtypes:df2 df.select_dtypes(object).copy()
df2.head()方法2: 通过 bool 型的 mask 获取 object 类型的列category_feature_mask df.dtypes object
category_cols df.columns[category_feature_mask].tolist()
df3 df[category_cols].copy()
df3.head()输出结果如下因为包含一些缺失值这里非常简单的选择丢弃的方法但实际上应该如何处理缺失值也是需要考虑很多因素包括缺失值的数量等但这里就不展开说明了# 简单的处理缺失值--丢弃
df2.dropna(inplaceTrue)标签编码第一种处理方法是标签编码其实就是直接将类别型特征从字符串转换为数字有两种处理方法直接替换字符串转为 category 类型后标签编码直接替换字符串算是手动处理实现如下所示这里用 body_style 这列特征做例子进行处理它总共有 5 个取值方式先通过 value_counts方法可以获取每个数值的分布情况然后映射为数字保存为一个字典最后通过 replace 方法进行转换。第二种就是将该列特征转化为 category 特征然后再用编码得到的作为数据即可自定义二分类第二种方法比较特别直接将所有的类别分为两个类别这里用 engine_type 特征作为例子假如我们仅关心该特征是否为 ohc ,那么我们就可以将其分为两类包含 ohc 还是不包含实现如下所示One-hot 编码前面两种方法其实也都有各自的局限性第一种标签编码的方式类别型特征如果有3个以上取值那么编码后的数值就是 012等这里会给模型一个误导就是这个特征存在大小的关系但实际上并不存在所以标签编码更适合只有两个取值的情况第二种自定义二分类的方式局限性就更大了必须是只需要关注某个取值的时候但实际应用很少会这样处理。因此这里介绍最常用的处理方法--One-hot 编码。实现 One-hot 编码有以下 3 种方法Pandas 的 get_dummiesSklearn 的 DictVectorizerSklearn 的 LabelEncoderOneHotEncoderPandas 的 get_dummies首先介绍第一种--Pandas 的 get_dummies这个方法使用非常简单了Sklearn 的DictVectorizer第二种方法--Sklearn 的 DictVectorizer这首先需要将 dataframe 转化为 dict 类型这可以通过 to_dict 并设置参数 orientrecords实现代码如下所示Sklearn 的 LabelEncoderOneHotEncoder第三种方法--Sklearn 的 LabelEncoderOneHotEncoder首先是定义 LabelEncoder实现代码如下可以发现其实它就是将字符串进行了标签编码将字符串转换为数值这个操作很关键因为 OneHotEncoder 是不能处理字符串类型的所以需要先做这样的转换操作接着自然就是进行 one-hot 编码了实现代码如下所示此外采用 OneHotEncoder 的一个好处就是可以指定特征的维度这种情况适用于如果训练集和测试集的某个特征的取值数量不同的情况比如训练集的样本包含这个特征的所有可能的取值但测试集的样本缺少了其中一种可能那么如果直接用 pandas 的get_dummies方法会导致训练集和测试集的特征维度不一致了。实现代码如下所示总结对于类别型特征最常用的还是 one-hot 编码但很多问题都是需要具体问题具体分析仅仅 one-hot 编码并不一定可以解决所有的类别型特征问题需要多实践多总结经验。代码例子在https://github.com/ccc013/CodesNotes/blob/master/Data_analysis/category_features_process_notes.ipynb或者点击左下方“阅读原文”查看。参考https://mlln.cn/2018/09/18/pandas%E6%96%87%E6%9C%AC%E6%95%B0%E6%8D%AE%E8%BD%AC%E6%95%B4%E6%95%B0%E5%88%86%E7%B1%BB%E7%BC%96%E7%A0%81%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/https://blog.csdn.net/selous/article/details/72457476https://towardsdatascience.com/encoding-categorical-features-21a2651a065chttps://www.cnblogs.com/zhoukui/p/9159909.html欢迎关注我的微信公众号--算法猿的成长或者扫描下方的二维码大家一起交流学习和进步如果觉得不错在看、转发就是对小编的一个支持推荐阅读