前言(~废话)
为了建立一个好的机器学习模型,对数据进行一定的处理是十分有必要的,接下来简单介绍几种初级的处理方法,后续将补充其他的数据处理的操作
线性回归之多项式转换
先来看一张图:
图一
对于很多场景下,对样本直接进行线性回归可能并不能达到很好的效果,比如图1
可能你已经想到可以对数据集进行多项式转换,图1中,我们的数学模型为:
多项式转换后我们的数学模型可以为m次方程:
通过多项式转换,我们便可以对图1的数据进行拟合从而得到一个相对直接进行线性回归好很多的数学模型
#简单的多项式转换demo如下
import numpy as np
from sklearn.preprocessing import PolynomialFeatures #多项式转换模块
X = np.arange(6).reshape(3,2)
poly1 = PolynomialFeatures(2) #进行2元多项式转换
poly1.fit(X)
poly1.transform(X)
多项式转化后对数据拟合后的效果根据函数的次数达到不同的效果:
数据的缺失值处理
样本中存在缺失值是很常见的情况,对于缺失值的处理常见的有一下几种方法:
1)样本确实严重情况下直接drop含有缺失值的样本
2)采用上一个样本或者后一个样本的的对应值来进行填充
3)使用数据集中该属性的平均值,众数进行填充
4)新增一个判断是否含有‘‘该属性缺失’’的属性
5)用一个固定的数(经验值)进行填充
6)根据结果分组,不同组采用各自组的均值或者众数进行填充
7)把缺失值作为新的label,建立模型得到预测值,然后进行填充。
One-Hot编码
在很多的数据集当中,某一属性的不同类别可能采用数字来表示,但并没有数字的意义,比如性别属性(男:0,女:1),但是没有了0<1这样的意义,但是建立模型去拟合这样的数据可能效果会很糟糕。这是One-Hot便有了用武之地。
大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。
#一个简单的demo
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2],[1,1,1]])
enc.transform([[0, 1, 3]]).toarray()
LabelEncoder
利用LabelEncoder()
将转换成连续的数值型变量。即是对不连续的数字或者文本进行编号例如,比如性别特征中(“男”,“女”),需要使用LabelEncoder将它们转换成数值型
#一个简单的demo
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
le.transform([1,1,100,67,5])
二值化
顾名思义,设置一个阈值将数据分为两部分(大于这个值的,小于这个值的)
#一个简单的demo
import numpy as np
from sklearn.preprocessing import Binarizer
arr = np.array([
[1.5, 1.3, 1.9],
[0.5, 0.5, 1.6],
[1.1, 2.1, 0.2]
])
binarizer = Binarizer(threshold=1.0).fit_transform(arr) #设置阈值,大于的编码为1,小于的编码为0
标准化
去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本。
其公式为:(x - x.mean() ) / x.std()
注意:
1)本方法要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕
*2)应用场景:在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候 *
3) 并不是所有的标准化都能给模型带来好处
作用:
评价指标(即特征向量中的不同特征就是所述的不同评价指标)往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
#一个简单的demo
from sklearn.preprocessing import StandardScaler
X = [
[1, 2, 3, 2],
[7, 8, 9, 2.01],
[4, 8, 2, 2.01],
[9, 5, 2, 1.99],
[7, 5, 3, 1.99],
[1, 4, 9, 2]
]
ss = StandardScaler(with_mean=True, with_std=True)
ss.fit(X)
ss.transform(X)
区间缩放法
计算公式:X - X.mean() / ( X.max() - X.min() )
1)适用比较适用在数值比较集中的情况
2)缺陷:如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量来替代max和min。
3)应用场景:在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法(不包括Z-score方法)。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围
#一个简单的demo
import numpy as np
from sklearn.preprocessing import MinMaxScaler
X = np.array([
[1, -1, 2, 3],
[2, 0, 0, 3],
[0, 1, -1, 3]
], dtype=np.float64)
scaler = MinMaxScaler(feature_range=(1,5)) #每一列数据都在在1-5直接之间进行缩放
scaler.fit(X)
#查看参数缩放后MinMaxScaler的属性
print (scaler.data_max_)
print (scaler.data_min_)
print (scaler.data_range_)
特征选择
选择方法1:移除方差较低的特征
导入特征选择库中的VarianceThreshold用于通过方差选择特征。方差为0的特征会被自动移除。剩下的特征按设定的方差的阈值进行选择。
选择方法2:单变量特征选择-卡方检验
#一个简单的demo
import numpy as np
from sklearn.feature_selection import VarianceThreshold
X = np.array([
[0, 2, 0, 3],
[0, 1, 4, 3],
[0.1, 1, 1, 3]
], dtype=np.float64)
Y = np.array([1,2,1])
print(X.std(axis=0))
#方差筛选
variance = VarianceThreshold(threshold=0.1) ##设置方差的阈值为0.1
print (variance)
variance.fit(X)
print (variance.transform(X)) #选择方差大于0.1的特征
#相关性筛选
from sklearn.feature_selection import chi2,SelectKBest
sk2 = SelectKBest(chi2, k=2) #选择相关性最高的前2个特征
sk2.fit(X, Y)
print (sk2)
print (sk2.scores_)
print (sk2.transform(X))