数据处理----------特征选择+降维

##########
          以前总觉得背诵是属于文科生的行为,跟工科有着十万八千里的距离,历时一个月没有跟进课程,再看之前敲过的代码,尤其是方法和包名,都变的陌生了许多。

~没有捷径,就是理解+反复练习+定期回顾+背记(不论新的知识点还是代码)
###########

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.]

你可能感兴趣的:(机器学习,python,机器学习,开发语言)