一肝劲、前言及回顧
從上一篇《PCA數(shù)據(jù)降維原理及python應(yīng)用(葡萄酒案例分析)》,我們知道,主成分分析PCA是一種無(wú)監(jiān)督數(shù)據(jù)壓縮技術(shù)涡相,上一篇逐步自行寫(xiě)代碼能夠讓我更好地理解PCA內(nèi)部實(shí)現(xiàn)機(jī)制哲泊,那知識(shí)熟悉以及技術(shù)成熟后我們可以運(yùn)用什么提高編碼效率?
答案就是:基于sklearn的主成分分析代碼實(shí)現(xiàn)催蝗,使用PCA類(lèi)進(jìn)行無(wú)監(jiān)督數(shù)據(jù)降維切威,仍然以葡萄酒數(shù)據(jù)集wine.data為案例,本文將運(yùn)用sklearn封裝的PCA類(lèi)來(lái)實(shí)現(xiàn)丙号,提高編碼效率先朦,而且會(huì)感覺(jué)十分簡(jiǎn)單,前提需要學(xué)習(xí)理解PCA實(shí)現(xiàn)原理及步驟犬缨。
這里回顧:《PCA數(shù)據(jù)降維原理及python應(yīng)用(葡萄酒案例分析)》
二喳魏、sklearn的PCA類(lèi)介紹
sklearn中的PCA類(lèi)相當(dāng)于一個(gè)轉(zhuǎn)換器,首先用訓(xùn)練數(shù)據(jù)來(lái)擬合模型怀薛,以葡萄酒數(shù)據(jù)集為例刺彩,通過(guò)邏輯回歸轉(zhuǎn)化樣本數(shù)據(jù),實(shí)現(xiàn)了主成分分析以及特征提取枝恋,直接調(diào)用PCA類(lèi)即可创倔。
三、分類(lèi)結(jié)果區(qū)域可視化函數(shù)
為了在分類(lèi)結(jié)果區(qū)別決策區(qū)域并可視化表示焚碌,這里編寫(xiě)plot_decision_region函數(shù)畦攘。
復(fù)制代碼
def plot_decision_regions(x, y, classifier, resolution=0.02):
? ? markers = ['s', 'x', 'o', '^', 'v']
? ? colors = ['r', 'g', 'b', 'gray', 'cyan']
? ? cmap = ListedColormap(colors[:len(np.unique(y))])
? ? x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1
? ? x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1
? ? xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
? ? z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
? ? z = z.reshape(xx1.shape)
? ? plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)
? ? for idx, cc in enumerate(np.unique(y)):
? ? ? ? plt.scatter(x=x[y == cc, 0],
? ? ? ? ? ? ? ? ? ? y=x[y == cc, 1],
? ? ? ? ? ? ? ? ? ? alpha=0.6,
? ? ? ? ? ? ? ? ? ? c=cmap(idx),
? ? ? ? ? ? ? ? ? ? edgecolor='black',
? ? ? ? ? ? ? ? ? ? marker=markers[idx],
? ? ? ? ? ? ? ? ? ? label=cc)
復(fù)制代碼
四、10行代碼完成葡萄酒數(shù)據(jù)集分類(lèi)
10行感覺(jué)是否很簡(jiǎn)單十电,確實(shí)關(guān)鍵步驟調(diào)用PCA類(lèi)和plt畫(huà)圖總共10行知押。
代碼如下:
復(fù)制代碼
pca = PCA(n_components=2) # 前兩個(gè)主成分
lr = LogisticRegression() # 邏輯回歸來(lái)擬合模型
x_train_pca = pca.fit_transform(x_train_std)
x_test_pca = pca.fit_transform(x_test_std)
lr.fit(x_train_pca, y_train)
plot_decision_regions(x_train_pca, y_train, classifier=lr)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.legend(loc='lower left')
plt.show()
復(fù)制代碼
這里看出使用到的主成分也是前兩個(gè),使用邏輯回歸對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行擬合鹃骂,建立模型台盯。
來(lái)看看結(jié)果就是這樣。訓(xùn)練集上的分類(lèi)效果還是很不錯(cuò)偎漫,跟上次自己實(shí)現(xiàn)的PCA幾乎一樣爷恳,這次加上了區(qū)域的邊界劃分,更加直觀象踊!
測(cè)試集上呢?居然是這樣!
觀察一下棚壁,發(fā)現(xiàn)好像也不是分類(lèi)錯(cuò)誤杯矩,而是發(fā)生鏡像反轉(zhuǎn)了。造成這種差異的原因是袖外,在測(cè)試集上的特征向量正負(fù)方向問(wèn)題史隆,所以需要將測(cè)試數(shù)據(jù)乘以-1反轉(zhuǎn)鏡像,從而得到正確的圖像曼验。
上面測(cè)試數(shù)據(jù)的pca直接乘以-1泌射,修改為:
x_test_pca = pca.fit_transform(x_test_std) * -1? # 預(yù)測(cè)時(shí)候特征向量正負(fù)問(wèn)題粘姜,乘-1反轉(zhuǎn)鏡像
這時(shí)候鏡像反轉(zhuǎn)就對(duì)了:看效果在測(cè)試集上的分類(lèi)也不錯(cuò)。
當(dāng)然熔酷,數(shù)據(jù)加載以及標(biāo)準(zhǔn)化處理還是原來(lái)的方法孤紧。
復(fù)制代碼
# load data
df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None)? # 本地加載
# split the data,train:test=7:3
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, stratify=y, random_state=0)
# standardize the feature 標(biāo)準(zhǔn)化單位方差
sc = StandardScaler()
x_train_std = sc.fit_transform(x_train)
x_test_std = sc.fit_transform(x_test)
復(fù)制代碼
五拒秘、完整代碼
這里完整給出代碼号显,并實(shí)現(xiàn)訓(xùn)練效果和測(cè)效果子圖的對(duì)比。
復(fù)制代碼
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def plot_decision_regions(x, y, classifier, resolution=0.02):
? ? markers = ['s', 'x', 'o', '^', 'v']
? ? colors = ['r', 'g', 'b', 'gray', 'cyan']
? ? cmap = ListedColormap(colors[:len(np.unique(y))])
? ? x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1
? ? x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1
? ? xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
? ? z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
? ? z = z.reshape(xx1.shape)
? ? plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)
? ? for idx, cc in enumerate(np.unique(y)):
? ? ? ? plt.scatter(x=x[y == cc, 0],
? ? ? ? ? ? ? ? ? ? y=x[y == cc, 1],
? ? ? ? ? ? ? ? ? ? alpha=0.6,
? ? ? ? ? ? ? ? ? ? c=cmap(idx),
? ? ? ? ? ? ? ? ? ? edgecolor='black',
? ? ? ? ? ? ? ? ? ? marker=markers[idx],
? ? ? ? ? ? ? ? ? ? label=cc)
def main():
? ? # load data
? ? # df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None)? # 本地加載
? ? df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',
? ? ? ? ? ? ? ? ? ? ? ? ? header=None)? # 服務(wù)器加載
? ? # split the data躺酒,train:test=7:3
? ? 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, stratify=y, random_state=0)
? ? # standardize the feature 標(biāo)準(zhǔn)化單位方差
? ? sc = StandardScaler()
? ? x_train_std = sc.fit_transform(x_train)
? ? x_test_std = sc.fit_transform(x_test)
? ? pca = PCA(n_components=2)
? ? lr = LogisticRegression()
? ? x_train_pca = pca.fit_transform(x_train_std)
? ? x_test_pca = pca.fit_transform(x_test_std) * -1? # 預(yù)測(cè)時(shí)候特征向量正負(fù)問(wèn)題押蚤,乘-1反轉(zhuǎn)鏡像
? ? lr.fit(x_train_pca, y_train)
? ? plt.figure(figsize=(6, 7), dpi=100)? # 畫(huà)圖高寬,像素
? ? plt.subplot(2, 1, 1)
? ? plot_decision_regions(x_train_pca, y_train, classifier=lr)
? ? plt.title('Training Result')
? ? plt.xlabel('PC1')
? ? plt.ylabel('PC2')
? ? plt.legend(loc='lower left')
? ? plt.subplot(2, 1, 2)
? ? plot_decision_regions(x_test_pca, y_test, classifier=lr)
? ? plt.title('Testing Result')
? ? plt.xlabel('PC1')
? ? plt.ylabel('PC2')
? ? plt.legend(loc='lower left')
? ? plt.tight_layout()? # 子圖間距
? ? plt.show()
if __name__ == '__main__':
? ? main()
深圳網(wǎng)站建設(shè)www.sz886.com