机器学习系列(3)_特征工程01数据预处理(下)

简介: 哑变量(DummyVariable),也叫虚拟变量, 引入哑变量的目的是,将不能够定量处理的变量量化

五、处理分类型特征:编码与哑变量



主要方法:


  1. preprocessing.LabelEncoder 标签专用法,将分类转换为分类数值
  2. preprocessing.OrdinalEncoder 特征专用法,将分类特征转换为分类数值
  3. preprocessing.OneHotEncoder 独热编码,创建哑变量


什么是哑变量呢?

哑变量(DummyVariable),也叫虚拟变量, 引入哑变量的目的是,将不能够定量处理的变量量化。


例如:在线性回归分析中引入哑变量的目的是,可以考察定性因素对因变量的影响,它是人为虚设的变量,通常取值为0或1,来反映某个变量的不同属性。对于有n个分类属性的自变量,通常需要选取1个分类作为参照,因此可以产生n-1个哑变量。如职业、性别对收入的影响,战争、自然灾害对GDP的影响,季节对某些产品(如冷饮)销售的影响等等。


这种“量化”通常是通过引入“哑变量”来完成的。根据这些因素的属性类型,构造只取“0”或“1”的人工变量,通常称为哑变量(dummyvariables),记为D。


举一个例子,假设变量“职业”的取值分别为:工人、农民、学生、企业职员、其他,5种选项,我们可以增加4个哑变量来代替“职业”这个变量,分别为D1(1=工人/0=非工人)、D2(1=农民/0=非农民)、D3(1=学生/0=非学生)、D4(1=企业职员/0=非企业职员),最后一个选项“其他”的信息已经包含在这4个变量中了,所以不需要再增加一个D5(1=其他/0=非其他)了。这个过程就是引入哑变量的过程。


此时,我们通常会将原始的多分类变量转化为哑变量,每个哑变量只代表某两个级别或若干个级别间的差异,通过构建回归模型,每一个哑变量都能得出一个估计的回归系数,从而使得回归的结果更易于解释,更具有实际意义。


(1)preprocessing.LabelEncoder 将标签转换为数值


使用LabelEncoder对目标标签进行编码,值在0到n_class -1之间。

from sklearn.preprocessing import LabelEncoder
y=data.iloc[:,-1]
y.shape
from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
le=le.fit(y)
label=le.transform(y)
le.classes_     # 标签中有多少类别
label

05c4e947ce7a4b79ba73594c7cf3da4e.png

le.fit_transform(y) 
le.inverse_transform(label) # 0代表死亡,1代表存活
data.loc[:,-1]=label
data.drop(['Survived'],axis=1,inplace=True)
data.rename(columns={-1:'Survived'},inplace=True)
data.head()

f23e5123a5954270b117f0e791d86d6e.png


(2)preprocessing.OrdinalEncoder 将特征转换为数值


preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值


6858f298df3a4fae8605d63cd1ae55f4.png


from sklearn.preprocessing import OrdinalEncoder
data_=data.copy()
data_
# 取出需要转换的两个字段
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1]
使用OrdinalEncoder将字符型变成数值
data_.iloc[:,1:-1]=OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])

3a039eb9522544b48aff0d8973af0a8d.png


(3)preprocessing.OneHotEncoder 将特征转为稀疏矩阵


使用OrdinalEncoder的处理结果会让各值之间有一定的联系,比如1-2=-1,0=1-1,会对建模产生一定的影响。此时则使用OneHotEncoder。

OneHotEncoder 独热编码作用:分类编码变量,将每一个类可能取值的特征变换为二进制特征向量,每一类的特征向量只有一个地方是1,其余位置都是0

from sklearn.preprocessing import OneHotEncoder
X=data.iloc[:,1:-1]
X

c88db0cb38d340ebbbf8b897f5490c67.png

enc=OneHotEncoder(categories="auto").fit(X)
enc.transform(X)
result=enc.transform(X).toarray()
result

也可以将使用OneHotEncoder后的数据进行还原:

# 将使用OneHotEncoder后的数据进行还原
pd.DataFrame(enc.inverse_transform(result))

bf87ce4abf6548b58b7e07f99725b81f.png

enc.get_feature_names()
newdata=pd.concat([data,pd.DataFrame(result)],axis=1)
newdata.drop(['Sex','Embarked'],axis=1,inplace=True)
newdata.columns=['Age','Survived','Female','Male','Embarked_C','Embarked_Q','Embarked_S']
newdata

整理后的数据:bf30c506e43f48a7b18f21106073e662.png

如果有缺失值的话使用众数进行填充:

imp_=SimpleImputer(strategy='most_frequent')
imp_mf=imp_.fit_transform(newdata.iloc[:,1:])
newdata.iloc[:,1:]=imp_mf


六、处理连续性特征:二值化与分段



(1)preprocessing.LabelBinarizer 标签二值化


标签可以使用sklearn.preprocessing.LabelBinarizer进行哑变量处理。

二值化:指将大于0的特征使用1表示,将等于0的特征还是用0表示。例如Binarizer(threshold=0.9) :将数据进行二值化,threshold表示大于0.9的数据为1,小于0.9的数据为0


对于二值化操作:

  • 方法一: 求出大于等于1的索引值,令这些索引值对应的数值等于1,然后重新构建列
  • 方法二:使用Binarizer(threshold=0.9) 表示大于0.9的数据使用1表示
    这里传入的参数需要是二维的,因此需要做维度转换
data_2=data.copy()
from sklearn.preprocessing import Binarizer
x=data_2.iloc[:,0].values.reshape(-1,1)
transformer=Binarizer(threshold=30).fit_transform(x)
transformer
# 将二值化返回newdata
newdata2=pd.concat([newdata,pd.DataFrame(transformer)],axis=1)
# 将二值化后的数据Age_code合并到原本数据当中
newdata2.columns=['Age','Survived','Female','Male','Embarked_C','Embarked_Q','Embarked_S','Age_code']
newdata2.drop(['Age'],axis=1,inplace=True) # 删除原本的Age

a1c4e627c474483d950a18a5381208a4.png

# 使用众数填充缺失值
imp_=SimpleImputer(strategy='most_frequent')
imp_mf=imp_.fit_transform(newdata2.iloc[:,-1:])
newdata2.iloc[:,-1:]=imp_mf


(2)preprocessing.KBinsDiscretizer 连续属性离散化


KBinsDiscretizer 类:这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。


使用k个等宽的bins把特征离散化,默认情况下,输出是被 one-hot 编码到一个稀疏矩阵。(请看类别特征编码)。 而且可以使用参数encode进行配置。对每一个特征, bin的边界以及总数目在 fit过程中被计算出来,它们将用来定义区间。

from sklearn.preprocessing import KBinsDiscretizer
x=data.iloc[:,0].values.reshape(-1,1)
est=KBinsDiscretizer(n_bins=3,encode='ordinal',strategy='uniform')
est.fit_transform(x)
set(est.fit_transform(x).ravel())
est=KBinsDiscretizer(n_bins=3,encode='onehot',strategy='uniform')
est.fit_transform(x).toarray()
newdata3=pd.concat([newdata,pd.DataFrame(est.fit_transform(x).toarray())],axis=1) # 将年龄进行分段
newdata3.columns=['Age','Survived','Female','Male','Embarked_C','Embarked_Q','Embarked_S','Age_1','Age_2','Age_3']

37cba3b9545046599c01d660f17c0ddf.png

此时得到的整理后的数据就都是浮点型了。

b46e86f39c7c4c43aaa024776ad26b91.png


相关文章
|
1月前
|
机器学习/深度学习 数据采集 数据挖掘
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
因果推断方法为特征工程提供了一个更深层次的框架,使我们能够区分真正的因果关系和简单的统计相关性。这种方法在需要理解干预效果的领域尤为重要,如经济学、医学和市场营销。
56 1
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
|
15天前
|
机器学习/深度学习 数据采集 Python
从零到一:手把手教你完成机器学习项目,从数据预处理到模型部署全攻略
【10月更文挑战第25天】本文通过一个预测房价的案例,详细介绍了从数据预处理到模型部署的完整机器学习项目流程。涵盖数据清洗、特征选择与工程、模型训练与调优、以及使用Flask进行模型部署的步骤,帮助读者掌握机器学习的最佳实践。
52 1
|
4月前
|
机器学习/深度学习 人工智能
8个特征工程技巧提升机器学习预测准确性
8个特征工程技巧提升机器学习预测准确性
104 6
8个特征工程技巧提升机器学习预测准确性
|
3月前
|
Java 前端开发 容器
Struts 2:在技术变革的风暴中航行,探索框架的革命性未来与创新融合之路
【8月更文挑战第31天】Struts 2作为一款成熟的企业级Java Web框架,凭借其稳定性和灵活性自2007年以来广受欢迎。它基于MVC设计模式,支持插件架构和RESTful服务,并能与Spring框架良好集成。然而,面对微服务架构和容器化技术(如Docker和Kubernetes)的兴起,Struts 2需提供更轻量级和支持指南来适应变化。通过深化与现代前端框架(如React和Vue.js)及AI技术的集成,并强化安全性与开发工具,Struts 2有望保持竞争力并迎接未来挑战。
47 0
|
3月前
|
机器学习/深度学习 SQL 数据采集
"解锁机器学习数据预处理新姿势!SQL,你的数据金矿挖掘神器,从清洗到转换,再到特征工程,一网打尽,让数据纯净如金,模型性能飙升!"
【8月更文挑战第31天】在机器学习项目中,数据质量至关重要,而SQL作为数据预处理的强大工具,助力数据科学家高效清洗、转换和分析数据。通过去除重复记录、处理缺失值和异常值,SQL确保数据纯净;利用数据类型转换和字符串操作,SQL重塑数据结构;通过复杂查询生成新特征,SQL提升模型性能。掌握SQL,就如同拥有了开启数据金矿的钥匙,为机器学习项目奠定坚实基础。
37 0
|
3月前
|
机器学习/深度学习 数据采集 算法
如何使用机器学习神器sklearn做特征工程?
如何使用机器学习神器sklearn做特征工程?
|
4月前
|
机器学习/深度学习 数据采集 存储
在机器学习和数据科学中,数据预处理是一个至关重要的步骤。数据规范化(或称为特征缩放)是预处理的一种常见技术,它可以帮助我们改进模型的性能。`sklearn.preprocessing`模块提供了多种数据规范化的方法,其中`StandardScaler`和`MinMaxScaler`是最常用的两种。
在机器学习和数据科学中,数据预处理是一个至关重要的步骤。数据规范化(或称为特征缩放)是预处理的一种常见技术,它可以帮助我们改进模型的性能。`sklearn.preprocessing`模块提供了多种数据规范化的方法,其中`StandardScaler`和`MinMaxScaler`是最常用的两种。
|
5月前
|
机器学习/深度学习 算法 Python
特征工程:机器学习成功的关键步骤
【6月更文挑战第4天】特征工程是机器学习的关键,涉及特征选择、构建和变换,旨在提升模型性能。通过处理原始数据,如顾客购买行为,选择相关特征,创建新特征并转换数据(如对数变换),可以增强模型预测能力。例如,对异常值丰富的收入数据进行对数变换,可提升模型稳定性和准确性。特征工程是耗时且需要创造力的过程,是连接数据与智能的桥梁,在机器学习中发挥着至关重要的作用。
76 2
|
6月前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型:从数据预处理到模型优化
【5月更文挑战第31天】 在当今数据驱动的时代,构建一个高效的机器学习(ML)模型是解决复杂问题的关键。本文将引导读者通过一系列细致的步骤来搭建健壮且精确的ML模型。我们将重点讨论数据预处理的策略、选择合适的算法、模型训练的技巧以及性能优化的方法。通过实例和代码示例,本技术分享旨在为从业者提供实用的指导,帮助他们在面对实际问题时能够灵活应用机器学习技术,并达到提高预测准确率和模型泛化能力的目的。
|
6月前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从数据预处理到模型优化
【5月更文挑战第28天】在机器学习领域,构建一个高效的模型并非易事。它要求我们不仅对算法有深入的理解,还需要掌握数据处理、特征工程以及模型调优等多方面知识。本文将引导读者了解如何从原始数据的收集与清洗开始,逐步进行特征选择和工程,最后通过各种方法对模型进行细致调优。我们将讨论数据预处理的重要性、特征工程的策略以及使用交叉验证、网格搜索等技术来提升模型性能。