1.数据挖掘的五大流程
| 获取数据 | |
| 数据预处理 | 数据类型不同;数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不易,有重复,数据量过大或过小 |
| 特征工程 | 特征过多过小,特征之间的相关性,特征与标签之间相关性,目的使降低运算成本,提升模型上限 |
| 建模 | 测试模型并预测结果 |
| 上线 | 验证模型效果 |
2.数据预处理
2.1数据的无量纲化
| 中心化 | 平移到某一区间,减法 |
| 缩放处理 | 缩放到某一区间,取对数或除法 |
2.1.1
processing.MinMaxScaler将数据缩放到【0,1】
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() result = scaler.fit_transform(data) result = scaler.reverse_transform(result)
同样可以使用numpy来实现这一过程
import numpy as np x = np.array([[1,4],[-1,2],[4,2],[5,3]]) x_nor = (x-x.min(axis=0))/(x.max(axis=0)-x.min(axis=0)) x_nor x_returned = x_nor*(x.max(axis=0)-x.min(axis=0))+x.min(axis=0) x_returned
2.1.2
preprocessing.StandardScaler 数据的标准化即正态分布
from sklearn,preprocessing import StandardScaler scaler = StandardScaler() result = scaler.fit_transform(data)
2.2填补缺失值
impute.SimpleImputer
numpy中对缺失值的处理·
data.loc[:,"age"] = data.loc[:,"age"].fillna(data.loc[:,"age"].median()) data.dropna(axis=0,inplace=True)
2.3处理分类型特征的编码与哑变量
标签专用:将不同标签转化为数值
from sklearn.preprocessing import LabelEncoder data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
特征专用:
from sklearn.preprocessing import OrdinalEncoder data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
独热编码:
preprocessing.OneHotEncoder可以用来处理名义变量,就是各变量之间没有完全的联系。
from sklearn.preprocessing import oneHotEncoder x= data.iloc[:,1:-1] enc = oneHotEncoder(categories="auto").fit_transform(x).toarray() #auto自动检索几个特征中的个数,结果为稀疏矩阵转换为数组类型 newdata = pd.concat([data,pd.Dataframe(enc)],axis=1) newdata.drop(["sex","embarked"],axis=1,inplace=True)
2.4处理连续性特征的二值化与分段
二值化preprocessing.Binarizer
from sklearn.preprocessing import Binarizer x = data.iloc[:,0].values.reshape(-1,1) #特征专用,不能使用一维数组 transformer = Binarizer(threshold=30).fit_transform()
分箱preprocessing.KBinsDiscretizer
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())#降维后用set去重
3.特征选择
1.特征工程 2.Filter过滤法
2.1方差过滤VarianceThreshold
from sklearn.feature_selection import VarianceThreshold selector = VarianceThreshold() #实例化,不填参数默认方差为0 X_var0 = selector.fit_transform(X) #获取删除不合格特征之后的新特征矩阵 #也可以直接写成 X = VairanceThreshold().fit_transform(X) X_var0.shape
方差过滤方法以特征方差的中位数为阈值的情况下KNN和随机森林的比较
2.2相关性过滤
考虑特征与标签的相关性:卡方过滤、F检验、互信息
卡方过滤:
专门针对于离散型标签的相关性过滤,t通过feature_selection.chi2计算特征与标签之际的卡方统计并进行排名,结合feature_selection.SelecKtBest输入k留下k个特征。
from sklearn.feature_selection import SelecKBest from sklearn.feature_selection import chi2 X_fschi = SelectKBest(chi2,k=300).fit_transform(x_fsvar,y)
通过p值判断相关性
chivalue, pvalues_chi = chi2(X_fsvar,y) chivalue pvalues_chi #k取多少?我们想要消除所有p值大于设定值,比如0.05或0.01的特征: k = chivalue.shape[0] - (pvalues_chi > 0.05).sum()
F检验:捕捉特征与标签之间的线性关系
feature_selection.f_classif
feature_selection.f_regression
和卡方检验原理相同放回F值和p值,p<0.5即线性相关
from sklearn.feature_selection import f_classif F, pvalues_f = f_classif(X_fsvar,y) F pvalues_f k = F.shape[0] - (pvalues_f > 0.05).sum()
互信息法:用于捕捉特征与标签之间的任意关系,不返回p值或f值而是返回【0,1】之间的数反应相关性,同样可以用作分类和回归类。
feature_selection.mutual_info_classif
feature_selection.mutual_info_regression
from sklearn.feature_selection import mutual_info_classif as MIC result = MIC(X_fsvar,y) k = result.shape[0] - sum(result <= 0)
3.嵌入法
feature_selection.SelectFromModel
嵌入法使用算法训练和特征选择同时进行,得到特征的权值系数即特征对模型的贡献程度选择特征,但我们无法确定一个准确的临界值去界定超参数来滤去多少特征。
from sklearn.feature_selection import SelectFromModel 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)
通过学习曲线选取阈值
RFC_.fit(X,y).feature_importances_
threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20)#(0,x)中20个数
score = []
for i in threshold:
X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,y)
once = cross_val_score(RFC_,X_embedded,y,cv=5).mean()
score.append(once)
plt.plot(threshold,score)
plt.show()
4.包装法:
包装法也是一个特征选择和算法训练同时进行的方法,与嵌入法十分相似,它也是依赖于算法自身的选择,比如 coef_属性或feature_importances_属性来完成特征选择。但不同的是,我们往往使用一个目标函数作为黑盒来帮 助我们选取特征,而不是自己输入某个评估指标或统计量的阈值。包装法在初始特征集上训练评估器,并且通过 coef_属性或通过feature_importances_属性获得每个特征的重要性。然后,从当前的一组特征中修剪最不重要的 特征。在修剪的集合上递归地重复该过程,直到最终到达所需数量的要选择的特征。区别于过滤法和嵌入法的一次 训练解决所有问题,包装法要使用特征子集进行多次训练,因此它所需要的计算成本是最高的
from sklearn.feature_selection import RFE RFC_ = RFC(n_estimators =10,random_state=0) selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X, y) selector.support_ #返回特征被选择最后的布尔矩阵 selector.ranking_ #返回迭代中的综合排名



