運(yùn)用sklearn進(jìn)行主成分分析(PCA)代碼實(shí)現(xiàn)

一肝劲、前言及回顧

從上一篇《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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羹应,一起剝皮案震驚了整個(gè)濱河市揽碘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌园匹,老刑警劉巖雳刺,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異偎肃,居然都是意外死亡煞烫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)累颂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)滞详,“玉大人,你說(shuō)我怎么就攤上這事紊馏×霞ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵朱监,是天一觀的道長(zhǎng)岸啡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)赫编,這世上最難降的妖魔是什么巡蘸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮擂送,結(jié)果婚禮上悦荒,老公的妹妹穿的比我還像新娘。我一直安慰自己嘹吨,他們只是感情好搬味,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般碰纬。 火紅的嫁衣襯著肌膚如雪萍聊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,895評(píng)論 1 314
  • 那天悦析,我揣著相機(jī)與錄音寿桨,去河邊找鬼。 笑死她按,一個(gè)胖子當(dāng)著我的面吹牛牛隅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酌泰,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼媒佣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陵刹?” 一聲冷哼從身側(cè)響起默伍,我...
    開(kāi)封第一講書(shū)人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衰琐,沒(méi)想到半個(gè)月后也糊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羡宙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年狸剃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狗热。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钞馁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匿刮,到底是詐尸還是另有隱情僧凰,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布熟丸,位于F島的核電站训措,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏光羞。R本人自食惡果不足惜绩鸣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纱兑。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驳遵。三九已至,卻和暖如春堤结,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竞穷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工唐责, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘾带,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓朴恳,卻偏偏與公主長(zhǎng)得像允蚣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子森渐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361