特征选取和特征选择的区别:特征选择:能够保持数据的原始特征;
特征抽取:将数据转换或者映射到新的特征空间;即在尽可能保持相关信息的前提下,对数据进行压缩;
减无监督数据降维技术:主成分分析法(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, 机械工业出版社;
转载本文请联系原作者获取授权,同时请注明本文来自李军科学网博客。
链接地址:http://blog.sciencenet.cn/blog-3377553-1134006.html
上一篇:Python_机器学习_总结9:数据预处理(2)
下一篇:Python_机器学习_总结11:降维压缩数据---线性判别法(LDA)