|
特征选取和特征选择的区别:
特征选择:能够保持数据的原始特征;
特征抽取:将数据转换或者映射到新的特征空间;即在尽可能保持相关信息的前提下,对数据进行压缩;
减无监督数据降维技术:主成分分析法(PCA)
PCA是基于特征之间的关系,识别数据内在的本质;
PCA是在高位数据中找到最大方差的方向,同时将数据映射到 维度更小(与原始数据相比)的新的子空间;
说明:转换到新空间后,
第一主成分的方差应该是最大的;
各主成分之间是不相关的(正交),后续各主成分也具备较大方差;
主成分方向对数据值范围高度敏感,因此需要对特征进行标准化处理;
算法基本流程如下:
对原始d微数据集做标准化处理;
构造样本的协方差矩阵;
计算协方差矩阵的特征值和相应的特征向量;
选择与前k个最大特征值相对于的特征向量,其中k为新特征空间维度;(k≤d)
通过前k个特征向量构建映射矩阵w;
通过映射矩阵w将d维数据集X转换到新的k为特征空间;
协方差矩阵:
两个特征之间的协方差为正,说明二者会同时增减;为负,说明二者异向;
协方差矩阵的特征向量代表主成分(最大方差方向),其对应的特征值大小就表示特征向量的重要性;
利用np.con()计算协方差矩阵;利用np.linalg.eig()求特征向量和特征值;
特征值的方差贡献率(variance explained rations):
贡献率是特征值和所有特征值之和的比值;
利用Np.cumsum()计算累计方差贡献率;
按照降序排列特征值和对应的特征向量
程序执行结果如下:
import pandas as pd df_wine = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None) df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline'] #将数据分成训练集和测试集 from sklearn.cross_validation import train_test_split X, y = df_wine.iloc[:,1:].values, df_wine.iloc[:,0].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,random_state=0) #标准化 from sklearn.preprocessing import StandardScaler stdsc = StandardScaler() X_train_std = stdsc.fit_transform(X_train) X_test_std = stdsc.transform(X_test) #计算特征值和特征向量 import numpy as np cov_mat = np.cov(X_train_std.T) eigen_vals, eigen_vecs = np.linalg.eig(cov_mat) print('\n Eigenvalues \n %s' % eigen_vals) #计算方差贡献率 tot = sum(eigen_vals) var_exp = [(i/tot) for i in sorted(eigen_vals, reverse=True)] cum_var_exp = np.cumsum(var_exp) import matplotlib.pyplot as plt plt.bar(range(1, 14), var_exp, alpha=0.5, align='center', label='individual explained variance') plt.step(range(1, 14), cum_var_exp, where='mid', label='cumulative explained variance') plt.ylabel('Explained variance ration') plt.xlabel('Principal components') plt.legend(loc='best') plt.show() #按照降序排列特征值和特征向量 eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:,i]) for i in range(len(eigen_vals))] eigen_pairs.sort(reverse=True) w = np.hstack((eigen_pairs[0][1][:, np.newaxis], eigen_pairs[1][1][:,np.newaxis])) print('Matrix W:"\n', w) #映射数据到新空间 X_train_pca = X_train_std.dot(w) #在新的空间中,显示数据 colors = ['r', 'b', 'g'] markers = ['s', 'x', 'o'] for l, c, m in zip(np.unique(y_train), colors, markers): plt.scatter(X_train_pca[y_train==l, 0], X_train_pca[y_train==l, 1], c=c, label=l, marker=m) plt.xlabel('PC 1') plt.ylabel('PC 2') plt.legend(loc='lower left') plt.show()
使用scikit-learn进行主成分分析:利用LogisticRegression回归进行分类
import matplotlib.pyplot as plt import pandas as pd df_wine = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None) df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline'] #将数据分成训练集和测试集 from sklearn.cross_validation import train_test_split X, y = df_wine.iloc[:,1:].values, df_wine.iloc[:,0].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,random_state=0) #标准化 from sklearn.preprocessing import StandardScaler stdsc = StandardScaler() X_train_std = stdsc.fit_transform(X_train) X_test_std = stdsc.transform(X_test) # from plot_decision_regions import plot_decision_regions from sklearn.linear_model import LogisticRegression from sklearn.decomposition import PCA pca = PCA(n_components=2) lr = LogisticRegression() X_train_pca = pca.fit_transform(X_train_std) X_test_pca = pca.transform(X_test_std) lr.fit(X_train_pca, y_train) plot_decision_regions(X_train_pca, y_train, classifier=lr) plt.xlabel('PC 1') plt.ylabel('PC 2') plt.legend(loc='lower left') plt.show()
#参考《Python 机器学习》,作者:Sebastian Raschaka, 机械工业出版社;
Archiver|手机版|科学网 ( 京ICP备14006957 )
GMT+8, 2019-2-19 12:51
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社