Advertisement

数据分析与挖掘3——特征工程

阅读量:

特征工程

  • 1.数据预处理
  • 2. 特征处理
  • 3.特征降维
    • 3.1. 特征选择
    • 3.2 线性降维

数据和特征决定了机器学习得上限,而模型和算法只是逼近这个上线

1.数据预处理

  1. 数据收集工作是整个流程的重要环节。
  2. 在数据分析前进行严格的清理工作以去除不规范或无效的数据。
  3. 当遇到类别分布不平衡的情况时,则可采取相应的处理措施。
  4. 当正类数量多于负类且总体规模较大时选择下采样策略。
  5. 当正类数量相对较多但整体规模适中时则可采用过采样方法。
  6. 或者调整损失函数以赋予不同类别不同的权重以平衡学习过程。

2. 特征处理

  1. 标准化:使得经过处理后的数据符合标准的正态分布。
复制代码
    #标准化
    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等模型通常建议进行数据缩放处理;
    • 不论选择哪种特征缩放方法, 都能在一定程度上都能消除变量间量纲差异的影响;
    • 对于优化过程而言, 特征缩放有助于提高梯度下降法求解最优解的速度
    1. 定量数据二值化:将数值型数据通过设置阈值的方式进行二值化
复制代码
    from sklearn.preprocessing import Binarizer
    b=Binarizer(threshold=3)#设置阈值,大于阈值的设为1,小于阈值的设为0
    b.fit_transform(data)

运行结果:

在这里插入图片描述
  1. 定性数据哑编码:将类别型数据转换为数值型数据,如:OneHotEncoder
复制代码
    from sklearn.preprocessing import OneHotEncoder
    oh=OneHotEncoder()
    oh.fit_transform(target.reshape((-1,1)))

运行结果:

在这里插入图片描述

7. 缺失值处理或填补

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'])

卡方检验 用于评估类别型特征与类别型目标之间的关联程度,并基于观察频数与期望频数的差异来判断变量间的独立性。卡方检验

复制代码
    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']为类别型标签

基于模型的特征选择

  1. 基于惩罚项的特征选择
复制代码
    #基于惩罚项的特征选择算法
    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
  1. 基于树模型的特征选择算法
复制代码
    #基于树模型的特征选择
    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

3.2 线性降维

基于一种线性变换将原始高维数据通过线性变换映射至低维空间,并假设在这些投影方向上能够最大化数据的方差;从而使得仅用较少的数据维度即可尽可能多地保留原始信息

在这里插入图片描述
复制代码
    #PCA进行特征降维
    from sklearn.decomposition import PCA
    pca=PCA(n_components=10)#n_components为主成分数目
    data_pca=pca.fit_transform(data_train[data_train_columns])
    data_pca=pd.DataFrame(data_pca)
    data_pca
  1. 线性判别式分析方法(LDA):LDA的核心思想是利用类别标签信息,在经过线性变换降维后使同类数据点尽量紧密聚集在一起,并且不同类别的数据点之间拉开距离。由此可知,LDA作为一种有监督学习算法,其主要优势在于能够有效利用类别信息提升分类性能。
在这里插入图片描述
复制代码
    #LDA线性降维选择特征(应用于分类)
    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
    lda=LDA(n_components=2)#特征降维后的维数
    data_lda=lda.fit_transform(data,target)
    data_lda=pd.DataFrame(data_lda)
    data_lda

该文深入探讨了主题建模的技术基础,并通过实际案例展示了其在文本处理中的应用价值。
详细阐述了主成分分析的方法论框架及其在降维过程中的作用机理。
分享了解决过拟合的有效策略与实践方法,并提供了相应的评估指标。
深入解析了过拟合现象的本质特征及其影响因素,并提出了相应的缓解方案。

补充说明:
LASSO回归、RIGDE回归是在线性回归的基础上添加L1、L2正则化项;

从线性回归模型的角度出发分析了损失函数的设计与优化目标

在这里插入图片描述

平方误差项等值线为在(w_1,w_2)空间中,第一项取值相同的点的连线。

在识别两个参数(如 w_1, w_2)之间的交汇点时,在坐标系中更容易实现这一目标(即 L1 正则化)。因此,在坐标轴上更容易实现这一目标(即 L1 正则化)。这通常导致某一特定特征的系数变为零(即 LASSO 回归),从而仅利用少数几个关键特征进行建模(即 LASSO 回归)。这正是为何 LASSO 能够产生稀疏解决方案的根本原因。

全部评论 (0)

还没有任何评论哟~