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

简介: 数据集有哪些?1、经典数据集:iris,*房价,Titanic,红酒,二手房,*CANCER,TMDB5000,netflix,航空飞行数据,恐袭数据,terror,DigitalRecognizor,医疗数据2、自建数据集:CNBOO,双色球,FZUNews,NBA,COVID19,国家社科基金,STUMOOC

数据集有哪些?

1、经典数据集:iris,*房价,Titanic,红酒,二手房,*CANCER,TMDB5000,netflix,航空飞行数据,恐袭数据,terror,DigitalRecognizor,医疗数据

2、自建数据集:CNBOO,双色球,FZUNews,NBA,COVID19,国家社科基金,STUMOOC


调用数据集的方法?

本地,远程(数据库,数据中台…)


一、数据中台



获取红酒数据:

from sklearn.datasets import load_wine # 调用SKlearn的数据中台数据
wine=load_wine()
wine

9961d7923ceb4b7ca017a33a433f05f9.png

winedf=pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)

044e236d847445e9a3d9849331975b0c.png

winedf.columns=['alcohol','malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline','']
winedf

9472b02c5a2342e3a23ab8409242b090.png

获取鸢尾花数据:

from sklearn.datasets import load_iris
iris=load_iris()
iris

数据集拿来做什么用?

b4456736c1974ceaad26d3c25ba8e0f8.png

如上图这样一份数据,我们可以做的是:

  1. 将每个字段进行可视化,观察随着时间的推移其变化的趋势
  2. 研究每个字段与碳排放的相关性
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16 entries, 0 to 15
Data columns (total 11 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   年份      16 non-null     int64  
 1   经济水平    16 non-null     float64
 2   产业结构    16 non-null     float64
 3   人口规模    16 non-null     int64  
 4   城市化水平   16 non-null     float64
 5   能源消费总量  16 non-null     int64  
 6   能源结构    16 non-null     float64
 7   电力消费    16 non-null     float64
 8   交通发展水平  16 non-null     float64
 9   森林覆盖率   16 non-null     float64
 10  碳排放     16 non-null     float64
dtypes: float64(8), int64(3)
memory usage: 1.5 KB

426b2ca65daf4a808c764cfe6f4032f8.png


二、sklearn中的数据预处理与特征工程



特征工程:将原始数据转换为更能代表模型潜在问题(价值)的特征的过程。需要挑选最相关的特征,提取特征或创造特征来实现知识挖掘。创造特征的过程往往采用降维的方式(PCA,SVD)。


可能面对的问题:特征之间的相关性问题,特征多少的问题,特征与标签(tag,target)的关联度问题

主要目的:降低计算成本,提升模型的表现(准确度等)


  1. preprocessing:数据预处理模块
  2. Imput:缺失值补充模块
  3. feature_selection:特征选择模块
  4. decomposition:包括了降维算法


三、数据无量纲



不同规格数据的同一化,不同分布的转换。

梯度,矩阵类,如逻辑回归,SVM,神经网络,可以加快求解速度。


距离类,如KNN,K-Means等,可以提升模型精度,避免某特征取值太大对距离计算造成的影响。

数据的无量纲化可以是线性的,也可以是非线性的。

线性的包括中心化处理,缩放处理。

中心化的核心是所有的记录-固定值,让数据样本进行平移(往往是Y轴为中心的位置)

缩放的核心是通过/固定值,将数据固定在某个范围内,如取对数等。

74fadf1932b94fc7ad43900e2262e048.png

观察上面数据,每个字段之间差值过大,通过以下代码实现归一化。

scaler=MinMaxScaler() # 进行实例化
scaler=scaler.fit(data) # 生成min()和max()
result=scaler.transform(data) # 获取到转换之后的数据
result # 此时得到的数据都是0-1之间,就消除了不同数据之间极差过大的情况

(1)preprocessing.MinMaxScaler 归一化

min-max归一化

指的是对原始数据进行线性变换,将其映射到[0,1]之间,该方法也被称为离差标准化3e33fd75874d4320b3b667762e36d677.png

上式中,min是样本的最小值,max是样本的最大值。由于最大值与最小值可能是动态变化的,同时也非常容易受噪声(异常点、离群点)影响,因此一般适合小数据的场景。

此外,该方法还有两点好处:

1.如果某属性/特征的方差很小,如身高:np.array([[1.70],[1.71],[1.72],[1.70],[1.73]]),实际5条数据在身高这个特征上是有差异的,但是却很微弱,这样不利于模型的学习,进行min-max归一化后为:array([[ 0. ], [ 0.33333333], [ 0.66666667], [ 0. ], [ 1. ]]),相当于放大了差异;2.维持稀疏矩阵中为0的条目。


将数据归一化,使用方法如下:

from sklearn.preprocessing import MinMaxScaler
x = np.array([[1,-1,2],[2,0,0],[0,1,-1]])
x1 = MinMaxScaler().fit_transform(x)

04f7a4d4ba2845869143a542e6313dc1.png

不难发现,x1每列的值都在[0,1]之间,也就是说,该模块是按列计算的。并且MinMaxScaler在构造类对象的时候也可以直接指定最大最小值的范围:scaler = MinMaxScaler(feature_range=(min, max)).

将归一化之后的数据进行还原:

# 数据归一化
scaler=MinMaxScaler() # 进行实例化
scaler=scaler.fit(lypdf) # 生成min()和max()
result=scaler.transform(lypdf)
result # 此时得到的数据都是0-1之间,就消除了不同数据之间极差过大的情况
# 将归一化的数据还原
scaler.inverse_transform(result)


  1. X=scaler.inverse_transform(X):将标准化后的数据转换为原始数据。
  2. X=pca.inverse_transform(newX):将降维后的数据转换成原始数据

将归一化的结果指定在特定的范围内:3379952d211c496a8580e7781089365a.png

(2)preprocessing.StandardScaler 标准化

z-score标准化(zero-mena normalization,0-均值标准化)方法的公式如下所示:

dd9a23cd18f042d7a821fec16b30c71e.png

上式中,x是原始数据,u是样本均值,σ是样本标准差。回顾下正态分布的基本性质,若x~N(u,σ^2),则e70d7a89bb1b4521babf8d6c516134bc.png


其中,N(0,1)表示标准正态分布。

于是,可以看出,z-score标准化方法试图将原始数据集标准化成均值为0,方差为1且接近于标准正态分布的数据集。然而,一旦原始数据的分布 不 接近于一般正态分布,则标准化的效果会不好。该方法比较适合数据量大的场景(即样本足够多)。此外,相对于min-max归一化方法,该方法不仅能够去除量纲,还能够把所有维度的变量一视同仁(因为每个维度都服从均值为0、方差1的正态分布),在最后计算距离时各个维度数据发挥了相同的作用,z-score标准化方法避免了不同量纲的选取对距离计算产生的巨大影响。所以,涉及到计算点与点之间的距离,如利用距离度量来计算相似度、PCA、LDA,聚类分析等,并且数据量大(近似正态分布),可考虑该方法。相反地,如果想保留原始数据中由标准差所反映的潜在权重关系应该选择min-max归一化。


from sklearn.preprocessing import StandardScaler
x = np.array([[1,2,3],[4,5,6],[1,2,1]])
x1 = StandardScaler().fit_transform(x)

798778441c7d45e89507f95ffc5ddd6d.png

可以发现,x1的每一列加起来都是0,方差是1左右。注意该方法同样按列(即每个属性/特征)进行计算。并且StandardScaler类还有一个好处,就是可以直接调用其对象的.mean_.std_方法查看原始数据的均值与标准差。

from sklearn.preprocessing import StandardScaler
data=[[-1,2],[-0.5,6],[0,10],[1,18]]
scaler=StandardScaler() # 进行标准化
scaler=scaler.fit(data) 

5b4b998444fd4ec49c796d76068b7182.png

(3)如何选择归一化和标准化

1、归一化,标准化两种算法中,NaN会被当做缺失值。在fit时会忽略,

在transform时显示NaN

2、 在fit时,只允许输入至少二维数组

data_=[-1,2,-0.5,6,0.9,10]
scaler=StandardScaler() # 进行标准化
scaler=scaler.fit(data_)  # 报错 ValueError: Expected 2D array, got 1D array instead:

上面这段代码报错,原因在于data_不是而二维数据

e0cd109151c1426580890dcb8e259e4d.png


3、大多数机器学习算法数据预处理时,会选择标准化进行特征缩放。因为归一化对异常值较为敏感,特别是在极差较大的数据维度,较大数据会被压缩到极小范围,导致计算结果不正常。

4、标准化适用于PCA,聚类,逻辑回归,SVM,神经网络等。

5、归一化在不涉及距离度量,梯度,协方差计算以及数据需要被压缩到特定区间时使用较好。比如数字图像中量化像素强度,使用归一化将数据压缩在【0,1】区间内。

6、其他选择:

  • 仅仅压缩数据,却不影响数据的稀疏性–》MaxAbsScaler
  • 异常值多,噪声非常大,用分位数无量纲化–》RobustScaler

四、缺失值处理



以泰坦尼克号数据为例:

import pandas as pd 
data=pd.read_csv("titanic.csv")
data=data[['Age','Sex','Embarked','Survived']]
data

bc4bee9d4fba4d408e072557e98639a5.png

data.isnull().any() # 判断是否有缺失值
data.isnull().sum() # 求出有多少个缺失值
data.isnull().sum()/data.shape[0]*100 # 计算缺失值占总体的百分比

fccf81ddfb6f4bf1b5ab23724d96b587.png

1)impute.SimpleImputer 缺失值填充


使用SimpleImputer(),对缺失值进行填充。

! pip install SimpleImputer
! pip install SimpleImputer

fe26c52e05a748018d84681dbdd3490d.png

对titanic的Age的缺失值进行填充:

# 对Titanic的Age进行填充
from sklearn.impute import SimpleImputer
imp_mean=SimpleImputer() # 实例化
imp_median=SimpleImputer(strategy='median') # 使用中位数对缺失值进行填补
imp_0=SimpleImputer(strategy="constant",fill_value=0) # 用常量0对缺失值进行填充
# 实际填充步骤
imp_mean=imp_mean.fit_transform(Age) # 注意:这里的Age一定是二维的
imp_median=imp_median.fit_transform(Age)  # 使用中位数对缺失值进行填补
imp_0=imp_0.fit_transform(Age) # 用常量0对缺失值进行填充
imp_mean # 此时有NaN值的地方全部都使用中位数填充了
data.loc[:,'Age']=imp_median

1cc5d81c53b5486290ebd63c3ca7d871.png

# 使用众数填充Embarked,但是Embarked默认是字符型
Embarked=data.loc[:,'Embarked'].values.reshape(-1,1) # 变成二维矩阵
Embarked.shape
imp_mode=SimpleImputer(strategy='most_frequent')
data.loc[:,"Embarked"]=imp_mode.fit_transform(Embarked)
data.info()

2874d6a7f3ee4daead076396f98fc99c.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天】在机器学习领域,构建一个高效的模型并非易事。它要求我们不仅对算法有深入的理解,还需要掌握数据处理、特征工程以及模型调优等多方面知识。本文将引导读者了解如何从原始数据的收集与清洗开始,逐步进行特征选择和工程,最后通过各种方法对模型进行细致调优。我们将讨论数据预处理的重要性、特征工程的策略以及使用交叉验证、网格搜索等技术来提升模型性能。

热门文章

最新文章