########## 以前总觉得背诵是属于文科生的行为,跟工科有着十万八千里的距离,历时一个月没有跟进课程,再看之前敲过的代码,尤其是方法和包名,都变的陌生了许多。 ~没有捷径,就是理解+反复练习+定期回顾+背记(不论新的知识点还是代码) ########### import numpy as np import warnings from sklearn.feature_selection import VarianceThreshold, SelectKBest from sklearn.feature_selection import f_regression from sklearn.feature_selection import chi2 from sklearn.feature_selection import RFE from sklearn.feature_selection import SelectFromModel from sklearn.linear_model import LogisticRegression X = np.array([ [0, 2, 0, 3], [0, 1, 4, 3], [0.1, 1, 1, 3] ], dtype=np.float32) Y = np.array([1, 2, 1]) print('------------VarianceThreshold:方差选择法:是根据特征属性每一列自身的方差进行计算--------------') variance = VarianceThreshold(threshold=0.1) print(variance) variance.fit(X) print("各个特征属性的方差为:") print(variance.variances_) ## [2.22222229e-03 2.22222222e-01 2.88888889e+00 0.00000000e+00] print('--------------------------------') print(variance.transform(X)) # 经过方差转换后的数组只剩2列,这是因为小于方差阈值threshold=0.1,就舍弃 # [[2. 0.] # [1. 4.] # [1. 1.]] print('------------相关系数法:主要针对Y值是回归任务的--------------') sk1 = SelectKBest(f_regression, k=3) # 相关系数法就是找X,Y之间的关系 sk1.fit(X, Y) print(sk1) print('--------------------------------') print(sk1.scores_) ## [ 0.33333333 0.33333333 16.33333333 nan] print('--------------------------------') print(sk1.transform(X)) # [[0. 2. 0. ] # [0. 1. 4. ] # [0.1 1. 1. ]] print('--------------卡方检验法:要求特征属性的取值为非负数且主要针对离散的数据性--------------') sk2 = SelectKBest(chi2, k=2) # 卡方检验法找X,Y之间的关系 sk2.fit(X, Y) print(sk2) print('--------------------------------') print(sk2.scores_) ## [0.05 0.125 4.9 0. ] print('--------------------------------') print(sk2.transform(X)) # [[2. 0.] # [1. 4.] # [1. 1.]] print('--------------基于特征消除法(递归迭代的过程):--------------') # 定义一个基础学习器:分类选逻辑回归;回归选线性回归 estimator = LogisticRegression() # 实例化特征消除法对象,step=2:代表每一步消除几个特征 sk3 = RFE(estimator, step=2, n_features_to_select=1) # 基于特征消除法找X,Y之间的关系 sk3.fit(X, Y) print('--------------------------------') print(sk3.support_) # [False False True False] print(sk3.n_features_) # 1 print(sk3.ranking_) # [3 2 1 3] print('--------------------------------') print(sk3.transform(X)) # [[0.] # [4.] # [1.]] print('------------------------给予惩罚项的特征选择法------------------------') X2 = np.array([ [5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2], [-6.3, 0.4, 5.4, 2.3], [-5.9, 0.0, 5.1, 1.8] ], dtype=np.float64) Y2 = np.array([0, 0, 2, 2]) estimator = LogisticRegression(penalty='l2', C=0.1, solver='liblinear') ## 基础学习器estimator sfm = SelectFromModel(estimator, threshold=0.06) sfm.fit(X2, Y2) print('threa系数:') print(sfm.estimator_.coef_) ## [[-0.2869815 -0.0989191 0.06591057 0.03654795]] print('-----------------------------------') print(sfm.transform(X2)) # [[ 5.1 3.5 1.4] # [ 4.9 3. 1.4] # [-6.3 0.4 5.4] # [-5.9 0. 5.1]] estimator = LogisticRegression(penalty='l1', C=0.1, solver='liblinear') # sfm = SelectFromModel(estimator, threshold=0.06) sfm = SelectFromModel(estimator) sfm.fit(X2, Y2) print('threa系数:') print(sfm.estimator_.coef_) ## [[-0.03545569 0. 0. 0. ]] print('-----------------------------------') print(sfm.transform(X2)) # [[ 5.1] # [ 4.9] # [-6.3] # [-5.9]] from sklearn.decomposition import PCA print('---------------采用PCA降维-----------------') X3 = np.array([ [5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2], [-6.3, 0.4, 5.4, 2.3], [-5.9, 0.0, 5.1, 1.8] ], dtype=np.float64) ## 这里n_components=3:指代降维后的输出维度是3, whiten=True:指代的是降维后的特征数据是否进行标准化(标准化的意思是均值为0,方差为1) # pca = PCA(n_components='mle', whiten=True) # 自动确定保留的特征数 pca = PCA(n_components=1, whiten=True) pca.fit(X3) print(pca) print('------------------------------') print(pca.mean_) # [-0.55 1.725 3.325 1.125] print('------------------------------') print(pca.components_) # [[-0.90396868 -0.2481073 0.31369949 0.15124818] # [ 0.05903993 -0.8272531 -0.24114991 -0.50399733] # [ 0.2747617 -0.48731645 0.00671966 0.8288447 ]] print(pca.transform(X3)) # transform(X) 将数据X转换成降维后的数据(这里坐标轴已经发生改变)当模型训练好后,对于新输入的数据,也可以用transform方法来降维。 # [[-0.88711589 -0.63458933 -1.02971927] # [-0.84413233 0.61299063 1.07781404] # [ 0.8960857 -1.04307579 0.59918554] # [ 0.83516251 1.06467449 -0.64728031]] print('------------------------------') print(pca.explained_variance_ratio_) ## 返回所保留的n个成分各自的方差百分比,这里可以理解为单个变量方差贡献率。可以看到第一个特征的单个变量方差贡献率已经到达0.997,意味着几乎保留了所有的信息,所以只保留一个特征即可。 # [9.97783181e-01 2.05778190e-03 1.59036977e-04] from sklearn.discriminant_analysis import LinearDiscriminantAnalysis import numpy as np print('---------------采用LDA降维-----------------') X5 = np.array([ [-1, -1, 3, 1], [-2, -1, 2, 4], [-3, -2, 4, 5], [1, 1, 5, 4], [2, 1, 6, -5], [3, 2, 1, 5] ]) Y5 = np.array([1, 2, 2, 2, 1, 1]) clf = LinearDiscriminantAnalysis(n_components=1) ## n_components <= n_class-1 clf.fit(X5, Y5) print('------------------------------') print(clf.transform(X5)) # [[ -9.76453015] # [-11.21112721] # [ 21.21675687] # [ 23.02500319] # [-11.69332623] # [-11.57277647]] print(clf.explained_variance_ratio_) ## [1.]