#第27篇分享:数据无量纲化(python语言:sklearn 预处理及特征工程)(3)

#数据挖掘五大流程:获取数据,数据预处理 (更改数据类型,有噪声,有缺失),特征工程 (归一化,标准化,正则化,降维),建模,测试模型并预测结果,上线验证模型效果;

1.为什么要进行数据预处理及特征工程:
数据预处理:
a.首先数据可能存在噪声或者缺失值或存在字符串类型特征不能直接输入模型;

b.数据的量纲不一致,有的特征数值很大,有的特征数值很小,对结果的影响不一致,数值很大也会拖慢计算时间(会影响一部分用距离预测的模型:例如:K近邻,K-Means,决策树不需要,决策树可以把任何数据处理好);
特征工程:
c.数据特征很多,但是很大一部分无有效信息或者信息量非常少,留下无用甚至成为干扰项;

数据预处理及特征工程之后,可以加快模型的求解速度,而且很多时候也可以提升模型预测的精度:

'''

数据预处理优势:
加快求解速度:逻辑回归,支持向量机,神经网络;
提升模型精度:K近邻,K-Means
决策树不需要,决策树可以把任何数据处理好。

使用的模块:
模块preprocessing:预处理模块
模块impute:填补缺失值专用;
模块feature_selection:包含特征选择的各种方法的实践

方法的理论:
数据无量纲化:不同规格数据转换到统一规格;线性无量纲化:
中心化:(所有数据减去一个固定的值,让数据平移到某个位置;)

归一化:(数据按最小值中心化后,再按极差缩放:x=(x-min(x))/(max(x)-min(x)))->preprocessing.MinMaxScaler

标准化:(数据按均值中心化后,再按标准差缩放,数据服从分布均值0,方差1的正太分布 x=(x-x均值)/x标准差)

数据处理过程先用标准化,不好用再试试归一化。

缺失值填补:
1.pandas填补;
2.impute.Simplelmputer


数据的编码:非数值型数值转换
preprocessing.LabelIEncoder
preprocessing.OrdinaIEncoder
preprocessing.OneHotEnocoder
preprocessing.Binarizer   根据阈值将特征转换为0/1
preprocessing.KBinsDiscretizer

特征选择:feature_selection
特征提取:指的是从文字,图像,声音提取有用的信息;
特征选择:选择对结果有影响的特征;过滤法,嵌入法,包装法,降维算法;
特征创造:通过组合计算得到新的特征;
'''

2.数据无量纲化:数据预处理,提升算法的准确度:

a.无量纲化(nondimensionalize 或者dimensionless):是指通过一个合适的变量替代,就是通过计算,将数据转变为更适合模型计算的数值,经过实践发现无量纲化后确实会加快算法速度及提升准确度。
数据训练之前的数据需要人工处理一下,因为sklearn模型是不接受字符串类型的数据,我们需要把字符串等类型数据统一转换为模型可识别的数值类型,比如对三分类变量用[0,1,2]代替;

b.提升模型的准确度:仅仅把字符串转化为数字是不够的,我们需要对数据进一步处理,也就特征工程,包括:数据归一化、数据标准化、数据正则化、降维以及特征编码等等:
归一化处理:把特征变量转换为最小值为0,最大值为1;
标准化处理:把特征变量转换成均值为0,方差为1;
正则化处理:正则化是用于抑制过拟合方法的统称,通过动态调整模型参数的取值 来降低模型的复杂度,用损失函数计算最优解的一般会使用正则化,逻辑回归,线性回归等,L1,L2正则;
数据降维:把数据按照一定方式降低维度,方差过滤比较容易理解,直接删除低于我规定方差的特征;但是PCA降维,我们只能查看结果及控制降到多少维度,无法确认降维的过程;
特征编码:例如常用的one_hot独热编码,可以把分类特征转化为数值类型;

①.数据归一化:
归一到0-1之间的数值(与最大最小数据有关,所以对异常值敏感):
#第27篇分享:数据无量纲化(python语言:sklearn 预处理及特征工程)(3)_第1张图片

#1.归一化处理:异常点影响很大,因为使用最大最小值计算
#1.数据归一化实例:
from sklearn.preprocessing import MinMaxScaler
data = [[-1,2],[-0.5,6],[0,10],[1,18]]
import pandas as pd
print(pd.DataFrame(data))

#a.实现数据的归一化:
scaler = MinMaxScaler()
result = scaler.fit_transform(data)
print(result)

#b.实现数据归一化不在0-1之间:
scaler1 = MinMaxScaler(feature_range=[5,10]) #改变归一化的范围,了解即可
result1 = scaler1.fit_transform(data)
print(result1)
#c.实现数据归一化反向操作:
data1 = scaler1.inverse_transform(result1)
print(data1)

②.数据标准化:
标准化与归一化类似,都是缩小数据范围,标准化是把数据转换为均值为0,方差为1范围内的数据:
#第27篇分享:数据无量纲化(python语言:sklearn 预处理及特征工程)(3)_第2张图片

#2.数据标准化实例:
from sklearn.preprocessing import StandardScaler
data = [[-1,2],[-0.5,6],[0,10],[1,18]]

#a.实现数据的标准化:
scaler = StandardScaler()
result = scaler.fit_transform(data)
print(result)
print(result.mean())
print(result.std())
print(scaler.var_ ) #查看方差属性
print(scaler.mean_ ) #查看均值属性

#c.实现数据归一化反向操作:
data1 = scaler.inverse_transform(result)
print(data1)

#可视化一下
import matplotlib.pyplot as plt
import pandas as pd
plt.figure(figsize=(10,5))
ax =plt.subplot(111)
result = pd.DataFrame(result)

plt.scatter(result[0],result[1])
plt.show()

③.数据正则化:一边是作为算法里面的惩罚项,数据预处理一般用不到:正则化
逻辑回归中的正则化
将经验风险最小化函数改为结构风险最小化函数,或者说将损失函数加上正则化项,可以使模型变简单,从而避免过拟合。以线性回归为例,常用的正则化有L1正则和L2正则。

④.数据降维:
数据降维降的是特征数量,无用的特征减少无论从计算时间还是预测准确方面都是有好处的:过滤式简单粗暴,方差小的认为意义不大,直接卡掉;

PCA降维过程相对复杂,不是删除某一个特征,我们可以加入参数,选择保留百分之多少的特征:

'''
特征方程:
过滤式:方差过滤;相关性过滤:卡方,F检验,互信息;
Embedded嵌入法:可以实现过滤法与相关性方法过滤的功能;
包装法RFE:feature_selection.RFE;
'''
# a.方差过滤:VarianceThreshold:认为特征方差小的没有意义
#对于需要遍历的算法很有效;随机森林不需要遍历,降低计算成本。
data = [[1,2,1],[1,1,1],[1,2,3],[1,3,1]] #不填参数,方差阈值0,第一个1就被过滤了
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
import numpy as np
data = pd.DataFrame(data)
selector = VarianceThreshold(np.median(data.var().values)) #np.median(data.var().values) 以中位数为阈值
x_var0 = selector.fit_transform(data)
print(x_var0,data,np.median(data.var()))

#b.相关性过滤:卡方,F检验,互信息
#①.卡方过滤:针对离散型标签:超参数:k保留特征个数,学习曲线寻找
#根据p进行k值的选择,p<0.05或0.01 p>0.05或0.01
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.ensemble import RandomForestClassifier as RFC

x_fschi = SelectKBest(chi2,k=300).fit_transform(x_fsvar,y)
x_fschi.shape()
chivalue,pvalues_chi=chi2(x_fsvar,y)
#根据p进行选择k
k = chivalue.shape[0]-(pvalues_chi>0.05).sum

#②.F检验:方差齐性检验,可以做分类及回归,
from sklearn.feature_selection import f_classif
F,pvalues_f = f_classif(x_fsvar,y)
k = F.shape[0]-(pvalues_f>0.05).sum

#③互信息法:捕捉每个特征与标签的任意关系的过滤方法;
# 返回每个特征与目标之间信息量的估计:0表示两个变量独立,1表示两个变量完全相关;
from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(x_fsvar,y)
k = result.shape[0] - sum(result<0)

#c.Embedded嵌入法:可以实现过滤法与相关性方法过滤的功能
from sklearn.feature_selection import SelectFromModel   #元变换器,对于拟合后有coef_,feature_importances_属性的评估器使用
from sklearn.ensemble import RandomForestClassifier as RFC

rfc_ = RFC(n_estimators=10,random_state=0)
x_embedded = SelectFromModel(rfc_,threshold=0.005).fit_transform(x,y) #threshold特征重要性的阈值
print(x_embedded.shape) #模型的维度会被降低,可以化学习曲线找寻最佳阈值

#d.包装法:feature_selection.RFE;n_feature_to_select:想要选取的特征个数;
#step:表示每次迭代希望移除的特征个数,estimator实例化后的评估器;.support_:
#返回所有特征是否最后备选的布尔矩阵;.ranking_:返回特征按次数迭代中综合重要性排名;

from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
rfc_ = RFC(n_estimators=10,random_state=0)
selector = RFE(rfc_,n_features_to_select=340,step=50).fit(x,y)

print(selector.support_.sum())
print(selector.ranking_)
x_wrapper = selector.transform(x)

cross_val_score(rfc_,x_wrapper,cv=5).mean()

数据降维:

#e.主成分分析PCA:降维,特征达到上百个用一下
from sklearn.decomposition import  PCA
'''
主成分分析进行特征降维
'''
pca = PCA(n_components=0.9)
data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)

#f.SVD奇异值分解:
是个不错的方法,学习中

以上就完成了数据预处理及特征工程的简单介绍,先做个目录用吧,不断填充信息。

持续更新,,,

你可能感兴趣的:(Skicit-learn,python,python,机器学习)