数据和特征决定了机器学习得上限,而模型和算法只是逼近这个上线
1.数据预处理
- 数据采集
- 数据清洗:去除脏数据
- 数据采样:数据存在不平衡得情况下使用,有上采样和下采样之分;正样本>负样本,且数据量大,采用下采样;正样本>负样本,数据量不大,采用上采样;或者修改损失函数设置样本权重
2. 特征处理
- 标准化:使得经过处理后的数据符合标准的正态分布。
#标准化
from sklearn.preprocessing import StandardScaler
ss=StandardScaler()
data=ss.fit_transform(data)
- 归一化:将样本的特征值转换到同一量纲下,消除特征之间不同量纲的影响,区间缩放是归一化的一种。
from sklearn.preprocessing import Normalizer
sn=Normalizer()
data_normalizer=sn.fit_transform(data)
#比较适用于数据较集中的情况
两者区别:
- 归一化容易受极端最大值和最小值的影响,比较适用于数值比较集中的情况;
- 数据中如果存在异常值和较多的噪声,使用标准化;
- SVM、KNN、PCA等模型必须进行标准化或归一化;
- 两者都可以消除量纲的影响;
- 提高梯度下降法求解最优解的速度;
- 定量数据二值化:将数值型数据通过设置阈值的方式进行二值化
from sklearn.preprocessing import Binarizer
b=Binarizer(threshold=3)#设置阈值,大于阈值的设为1,小于阈值的设为0
b.fit_transform(data)
运行结果:
- 定性数据哑编码:将类别型数据转换为数值型数据,如:OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
oh=OneHotEncoder()
oh.fit_transform(target.reshape((-1,1)))
运行结果:
7. 缺失值处理
数据分析与挖掘2——数据预处理
8. 数据转换
3.特征降维
3.1. 特征选择
方差选择特征:计算各个特征的方差,通过设置方差的阈值训责特征
data_train_columns=[col for col in data_train.columns if col not in ['target']]
# 方差筛选特征,设置方差阈值为1
from sklearn.feature_selection import VarianceThreshold
vt=VarianceThreshold(threshold=1)
data_vt=vt.fit_transform(data_train[data_train_columns])
data_vt=pd.DataFrame(data_vt)
相关系数: 计算各个特征对目标值的相关系数(皮尔逊相关系数)
#相关系数法筛选特征,选择特征个数
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
skb=SelectKBest(lambda X,Y:np.array(list(map(lambda x:pearsonr(x,Y),X.T))).T[0],k=10)
data_skb=skb.fit_transform(data_train[data_train_columns],data_train['target'])
卡方检验:计算类别型特征和类别型target之间的相关性.卡方检验
from sklearn.feature_selection import chi2
SelectKBest(chi2,k=2).fit_transform(x,y)
最大信息系数法:计算类别型特征和类别型target之间的相关性
from minepy import MINE
def mic(x,y):
m=MINE()
m.compute_score(x,y)
return (m.mic(),0.5)
SelectKBest(lambda X,Y:np.array(list(map(lambda x:mic(x,Y),X.T))).T[0],k=10).fit_transform(train_data,train_target)
递归消除特征法:RFE 算法通过增加或移除特定特征变量获得能最大化模型性能的最优组合变量。
#RFE递归消除法
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
rfe=RFE(estimator=LogisticRegression(multi_class='auto',
solver='lbfgs',
max_iter=500),n_features_to_select=10)
#estimator为基模型,为逻辑回归模型,用于分类
#solver:几种优化方法。小数据集中,liblinear是一个好选择,sag和saga对大数据集更快;多类别问题中,除了liblinear其它四种算法都可以使用;newton-cg,lbfgs和sag仅能使用L2惩罚项,liblinear和saga使用L1惩罚项。
#max_iter:int类型,默认为‘100’,仅适用于newton-cg, sag和lbfgs算法;表示算法收敛的最大次数。
#n_features_to_select=10为选择的特征的个数
data_rfe=rfe.fit_transform(data_train[data_train_columns],data_train['target'])#data_train['target']为类别型标签
基于模型的特征选择
- 基于惩罚项的特征选择
#基于惩罚项的特征选择算法
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
sfm=SelectFromModel(LogisticRegression(penalty='l2',C=0.1,solver='lbfgs',multi_class='auto'))
#solver为优化算法,lbfgs优化算法仅支持l2;penalty为惩罚项,惩罚项是用来添加参数避免过拟合,可以理解为对当前训练样本的惩罚,用以提高函数的泛化能力;C为正则化系数的倒数,值越小,表示越强的正则化
data_sfm=sfm.fit_transform(data,target)
data_sfm=pd.DataFrame(data_sfm)
data_sfm
- 基于树模型的特征选择算法
#基于树模型的特征选择
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
sfmGBDT=SelectFromModel(GradientBoostingClassifier())
data_sfmGBDT=sfmGBDT.fit_transform(data,target)
data_sfm=pd.DataFrame(data_sfm)
data_sfm