python入门-分类和回归各种初级算法
生活随笔
收集整理的這篇文章主要介紹了
python入门-分类和回归各种初级算法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
引自:http://www.cnblogs.com/taichu/p/5251332.html
?###########################
#說(shuō)明: # 撰寫(xiě)本文的原因是,筆者在研究博文“http://python.jobbole.com/83563/”中發(fā)現(xiàn) # 原內(nèi)容有少量筆誤,并且對(duì)入門(mén)學(xué)友缺少一些信息。于是筆者做了增補(bǔ),主要有: # 1.查詢并簡(jiǎn)述了涉及的大部分算法; # 2.添加了連接或資源供進(jìn)一步查詢; # 3.增加了一些lib庫(kù)的基本操作及說(shuō)明; # 4.增加了必須必要的python的部分語(yǔ)法說(shuō)明; # 5.增加了對(duì)模型算法,數(shù)據(jù)挖掘等領(lǐng)域的思考和判斷; # 6.修訂了原作者代碼上的筆誤,跑通全部程序,拷貝就可用! # 7.其他 # 目標(biāo)是:針對(duì)python是0基礎(chǔ)!但喜歡數(shù)據(jù)挖掘的初級(jí)學(xué)友,方面其入門(mén),減少挫折感! # 通過(guò)“一份帶注釋的可用代碼”來(lái)學(xué)習(xí)! #建議:先學(xué)習(xí),或初步瀏覽原作者的博文(如上)。 #鏈接:筆者資源收集貼“http://www.cnblogs.com/taichu/p/5216659.html”,供新老學(xué)友參考,筆者會(huì)不斷整理更新! ###################################################### #(0)心得 # 1.因?yàn)閿?shù)據(jù)的找尋,分析和建模一條龍代價(jià)不菲。 # 應(yīng)該‘榨干’一份數(shù)據(jù)和模型的每種可能性,徹底研究掌握。 # 往往能一通百通,一個(gè)模型反復(fù)折騰能用到各種方法和體會(huì)! ###################################################### #(1)觀察原始數(shù)據(jù)(樣本) #知識(shí)點(diǎn):數(shù)據(jù)導(dǎo)入;數(shù)據(jù)可視化 ############################################# #在ubuntu15.10中通過(guò)如下6條命令來(lái)安裝python環(huán)境 #sudo apt-get install python #安裝python最新版,一般已經(jīng)自帶最新2.7版本了 #sudo apt-get install python-numpy #安裝python的numpy模塊 #sudo apt-get install python-matplotlib #sudo apt-get install python-networkx #sudo apt-get install python-sklearn #python #看python版本并進(jìn)入交互式界面,就可以執(zhí)行如下命令,全部拷貝黏貼進(jìn)去試試看? #另外,可以下載Anaconda的Python IDE集成環(huán)境,搜一下非常好,很多SCIPY等核心庫(kù)都集成了,免去安裝之苦! #特別注意:筆者是WIN10宿主機(jī)上安裝Ubuntu15.10最新虛擬機(jī),在Ubuntu中默認(rèn)安裝了python,升級(jí)并安裝以上lib后實(shí)踐所有如下代碼! ################## import urllib2 url = 'http://aima.cs.berkeley.edu/data/iris.csv' u = urllib2.urlopen(url) #以下為本地樣本存儲(chǔ)路徑,請(qǐng)根據(jù)實(shí)際情況設(shè)定! #localfn='/mnt/hgfs/sharedfolder/iris.csv' #for linux localfn='D:\\Virtual Machines\\sharedfolder\\iris.csv' #for windows localf = open(localfn, 'w') localf.write(u.read()) localf.close() # data examples #COL1, COL2, COL3, COL4, COL5 #5.1 3.5 1.4 0.2 setosa #… … … … … #4.7 3.2 1.3 0.2 setosa #7 3.2 4.7 1.4 versicolor #… … … … … #6.9 3.1 4.9 1.5 versicolor #6.3 3.3 6 2.5 virginica #… … … … … #7.1 3 5.9 2.1 virginica############################# #U can get description of 'iris.csv' #at 'http://aima.cs.berkeley.edu/data/iris.txt' #Definiation of COLs: #1. sepal length in cm (花萼長(zhǎng)) #2. sepal width in cm(花萼寬) #3. petal length in cm (花瓣長(zhǎng)) #4. petal width in cm(花瓣寬) #5. class: # -- Iris Setosa # -- Iris Versicolour # -- Iris Virginica #Missing Attribute Values: None ################################# from numpy import genfromtxt, zeros # read the first 4 columns data = genfromtxt(localfn,delimiter=',',usecols=(0,1,2,3)) # read the fifth column target = genfromtxt(localfn,delimiter=',',usecols=(4),dtype=str)print data.shape # output: (150, 4) print target.shape # output: (150,)#auto build a collection of unique elements print set(target) # output: set(['setosa', 'versicolor', 'virginica']) #print set(data) #wrong usage of set, numbers is unhashable ###################### #plot庫(kù)用法簡(jiǎn)述: #'bo'=blue+circle; 'r+'=red+plus;'g'=red+* #search keyword 'matlab plot' on web for details #http://www.360doc.com/content/15/0113/23/16740871_440559122.shtml #http://zhidao.baidu.com/link?url=6JA9-A-UT3kmslX1Ba5uTY1718Xh-OgebUJVuOs3bdzfnt4jz4XXQdAmvb7R5JYMHyRbBU0MYr-OtXPyKxnxXsPPkm9u5qAciwxIVACR8k7 ###################### #figure for 2D data from pylab import plot, show plot(data[target=='setosa',0],data[target=='setosa',2],'bo') plot(data[target=='versicolor',0],data[target=='versicolor',2],'r+') plot(data[target=='virginica',0],data[target=='virginica',2],'g*') show()
?
#注意:如果在Ubuntu的python交互式環(huán)境下運(yùn)行,則figure會(huì)打斷程序的RUN. #如果你用Anaconda的spyder(Python2.7)則方便的多,生成的figure會(huì)自動(dòng)輸出到console #且不會(huì)打斷程序運(yùn)行!#figure for all 4D(4個(gè)維度) data, 同色一類,圈是花萼,加號(hào)花瓣 setosa_sepal_x=ssx=data[target=='setosa',0] setosa_sepal_y=ssy=data[target=='setosa',1] setosa_petal_x=spx=data[target=='setosa',2] setosa_petal_y=spy=data[target=='setosa',3]versicolor_sepal_x=vsx=data[target=='versicolor',0] versicolor_sepal_y=vsy=data[target=='versicolor',1] versicolor_petal_x=vpx=data[target=='versicolor',2] versicolor_petal_y=vpy=data[target=='versicolor',3]virginica_sepal_x=vgsx=data[target=='virginica',0] virginica_sepal_y=vgsy=data[target=='virginica',1] virginica_petal_x=vgpx=data[target=='virginica',2] virginica_petal_y=vgpy=data[target=='virginica',3]plot(ssx,ssy,'bo',spx,spy,'b+') plot(vsx,vsy,'ro',vpx,vpy,'r+') plot(vgsx,vgsy,'go',vgpx,vgpy,'g+') show() #figure for 1D(花萼的長(zhǎng)度),三類長(zhǎng)度及平均值的直方圖 #pylab詳細(xì)用法參考如下 #http://hyry.dip.jp/tech/book/page/scipy/matplotlib_fast_plot.html from pylab import figure, subplot, hist, xlim, show xmin = min(data[:,0]) xmax = max(data[:,0]) figure() #可省略,默認(rèn)會(huì)生成一個(gè)figure subplot(411) # distribution of the setosa class (1st, on the top) hist(data[target=='setosa',0],color='b',alpha=.7) xlim(xmin,xmax) #subplot(行,列,plot號(hào));(4,1,2)合并為412,都小于10可合成 subplot(412) # distribution of the versicolor class (2nd) hist(data[target=='versicolor',0],color='r',alpha=.7) xlim(xmin,xmax) subplot(413) # distribution of the virginica class (3rd) hist(data[target=='virginica',0],color='g',alpha=.7) xlim(xmin,xmax) subplot(414) # global histogram (4th, on the bottom) hist(data[:,0],color='y',alpha=.7) xlim(xmin,xmax) show() ########################### #(2)樣本分類 # 樸素貝葉斯分類器是常用的一種,分為(高斯模型/非多項(xiàng)式模式/非伯努利模式) ########################### #仿造target陣列(1維)弄出全0的t陣列 t = zeros(len(target)) #type(t) #show type of t (numpy.ndarray) #print t #show contains of t #將target陣列中特定元素的位置設(shè)置為1(真簡(jiǎn)潔) t[target == 'setosa'] = 1 t[target == 'versicolor'] = 2 t[target == 'virginica'] = 3 #print t#用全部data集來(lái)做訓(xùn)練 from sklearn.naive_bayes import GaussianNB classifier = cf = GaussianNB() cf.fit(data,t) # training on the iris dataset print cf.predict(data[0]) #訓(xùn)練完分類1條數(shù)據(jù) #output:[ 1.] print t[0] #output:1.0#從原始數(shù)據(jù)data中劃分為訓(xùn)練集和驗(yàn)證集,t也做同樣劃分 from sklearn import cross_validation train, test, t_train, t_test = cross_validation.train_test_split(data, t, \ test_size=0.4, random_state=0)print train.shape #output:(90, 4) print test.shape #output:(60, 4) print t_train.shape #output:(90,) print t_test.shape #output:(60,)#用60%數(shù)據(jù)訓(xùn)練后,再用40%數(shù)據(jù)驗(yàn)證,得到93.3% cf.fit(train,t_train) # train print cf.score(test,t_test) # test #output:0.93333333333333335 cf.score(train,t_train) #用訓(xùn)練集訓(xùn)練后同樣用它測(cè)試居然不是100%分類! #output:0.97777777777777775#用全部數(shù)據(jù)訓(xùn)練后,同樣用它測(cè)試,結(jié)果低于剛才97% cf.fit(data,t) #output:GaussianNB() cf.score(data,t) #output:0.95999999999999996#用100%數(shù)據(jù)訓(xùn)練后,再用40%數(shù)據(jù)驗(yàn)證,得到94.99% cf.fit(data,t) #output:GaussianNB() cf.score(test,t_test) #output:0.94999999999999996
?
########################################################### #TODO:研究計(jì)劃(筆者會(huì)另立博文研究此問(wèn)題) #因?yàn)闃闼刎惾~斯分類法基于每個(gè)feature都是概率獨(dú)立不相關(guān)。但其實(shí)相關(guān),可嘗試: #1.顯然花萼長(zhǎng)寬,花瓣的長(zhǎng)寬,是很強(qiáng)的相關(guān)性,形成2個(gè)新feature;為sepal-size,petal-size #2.花萼與花瓣的長(zhǎng)度合并,寬度合并,可能也有相關(guān)性,形成2個(gè)新feature!為whole-length,whole-wide #3.原來(lái)花萼長(zhǎng)與寬,花瓣長(zhǎng)與寬,就是4個(gè)初始feature; #4.以上初步判斷的8個(gè)feature的組合關(guān)系?舉例:一種花,就是花瓣很小,花萼較大呢?生物學(xué)有必然比例ratio嗎? # 再比如,一種花整體都很修長(zhǎng)?或矮短? # 我們也懷疑sepal-size和petal-size有一定的概率聯(lián)系(正相關(guān)或負(fù)相關(guān)或某種關(guān)系) # 即使分類器做到了100%,對(duì)未來(lái)樣本的分類也不一定100%正確,因?yàn)闃颖镜氖占泊嬖跇?biāo)定誤差(人為錄入誤差) #TRY:嘗試變更模型,數(shù)據(jù)轉(zhuǎn)換后,再次做分類測(cè)試,交叉驗(yàn)證,期望提升準(zhǔn)確率! ############################################################# #用混淆矩陣估計(jì)分類器表現(xiàn) from sklearn.metrics import confusion_matrix print confusion_matrix(cf.predict(test),t_test) #output:[[16 0 0] #output: [ 0 23 4] #output: [ 0 0 17]] #混淆矩陣簡(jiǎn)單說(shuō)明 # 預(yù)測(cè)情況 # ----------- # 類1 類2 類3 #實(shí) |類1 43 5 2 #際 |類2 2 45 3 #情 |類3 0 1 49 #況 | # #說(shuō)明:正確的猜測(cè)都在表格的對(duì)角線 #解讀:實(shí)際情況是3個(gè)類每個(gè)都50個(gè)樣本; # 類3有1個(gè)錯(cuò)誤的猜測(cè)為類2; # 類2有2個(gè)錯(cuò)誤的猜測(cè)為類1,3個(gè)錯(cuò)誤的識(shí)別為類3 # 類1有5個(gè)錯(cuò)誤的猜測(cè)為類2,2個(gè)錯(cuò)誤的識(shí)別為類3#分類器性能的完整報(bào)告 #Precision:正確預(yù)測(cè)的比例 #Recall(或者叫真陽(yáng)性率):正確識(shí)別的比例 #F1-Score:precision和recall的調(diào)和平均數(shù) from sklearn.metrics import classification_report print classification_report(classifier.predict(test), t_test, target_names=['setosa', 'versicolor', 'virginica']) #output: precision recall f1-score support #output: setosa 1.00 1.00 1.00 16 #output:versicolor 1.00 0.85 0.92 27 #output: virginica 0.81 1.00 0.89 17 #output:avg / total 0.95 0.93 0.93 60?
############################################################## #補(bǔ)充調(diào)和平均數(shù)知識(shí)點(diǎn) #調(diào)和平均數(shù):Hn=n/(1/a1+1/a2+...+1/an) #幾何平均數(shù):Gn=(a1a2...an)^(1/n) #算術(shù)平均數(shù):An=(a1+a2+...+an)/n #平方平均數(shù):Qn=√ [(a1^2+a2^2+...+an^2)/n] #這四種平均數(shù)滿足 Hn ≤ Gn ≤ An ≤ Qn # #調(diào)和平均數(shù)典型舉例: #問(wèn):有4名學(xué)生分別在一個(gè)小時(shí)內(nèi)解題3、4、6、8道,求平均解題速度多少(1小時(shí)能解幾道)? #答:就是求調(diào)和平均數(shù),即1/[(1/3+1/4+1/6+1/8)/4]=4/(1/3+1/4+1/6+1/8)=4.57 ############################################################以上僅僅只是給出用于支撐測(cè)試分類的數(shù)據(jù)量。 #分割數(shù)據(jù)、減少用于訓(xùn)練的樣本數(shù)以及評(píng)估結(jié)果等操作 #都依賴于配對(duì)的訓(xùn)練集和測(cè)試集的隨機(jī)選擇#如果要切實(shí)評(píng)估一個(gè)分類器并與其它的分類器作比較的話, #我們需要使用一個(gè)更加精確的評(píng)估模型,例如Cross Validation。 #該模型背后的思想很簡(jiǎn)單:多次將數(shù)據(jù)分為不同的訓(xùn)練集和測(cè)試集, #最終分類器評(píng)估選取多次預(yù)測(cè)的平均值。 #sklearn為我們提供了運(yùn)行模型的方法:?
from sklearn.cross_validation import cross_val_score # cross validation with 6 iterations scores = cross_val_score(classifier, data, t, cv=6) print scores #output:[ 0.92592593 1. 0.91666667 0.91666667 0.95833333 1. ]#并非迭代越多次越好。當(dāng)前CV=6,迭代6次#輸出是每次模型迭代產(chǎn)生的精確度的數(shù)組。我們可以很容易計(jì)算出平均精確度: from numpy import mean print mean(scores) #output:0.96 #循環(huán)不斷增加迭代cv次數(shù),并輸出mean值 #迭代CV必須>=2,否則報(bào)錯(cuò)'ValueError: k-fold cross validation requires at least one train / test split by setting n_folds=2 or more, got n_folds=1.' #迭代CV必須小于最小的一個(gè)樣本數(shù)目(對(duì)t=50;t_train=27;t_test=16),詳見(jiàn)后面ndarray歸類打印!
#1.窮舉data的所有迭代cv可能的交叉驗(yàn)證平均值并打印 for i in range(2, 51):scores = cross_val_score(classifier, data, t, cv=i)print mean(scores)#每句for語(yǔ)句在交互式界面必須跟一行空行(沒(méi)任何字符包括空格)才能表示輸入結(jié)束! #2.窮舉test的所有迭代cv可能的交叉驗(yàn)證平均值并打印 for i in range(2, 17): print mean(cross_val_score(classifier, test, t_test, cv=i)) #3.窮舉train的所有迭代cv可能的交叉驗(yàn)證平均值并打印
for i in range(2, 28): print mean(cross_val_score(classifier, train, t_train, cv=i)) #對(duì)一維numpy.ndarray數(shù)字值歸類并打印 ndarray={} for item in t: ndarray[item] = ndarray.get(item, 0) + 1 #下面必須有一行空行(沒(méi)任何空格!),讓交互式python確認(rèn)for語(yǔ)句完成輸入 print(ndarray) #output:{1.0: 50, 2.0: 50, 3.0: 50}#對(duì)一維numpy.ndarray數(shù)字值歸類并打印 ndarray={} for item in t_train: ndarray[item] = ndarray.get(item, 0) + 1#下面必須有一行空行,讓交互式python確認(rèn)for語(yǔ)句完成輸入print(ndarray) #output:{1.0: 34, 2.0: 27, 3.0: 29}#對(duì)一維numpy.ndarray數(shù)字值歸類并打印 ndarray={} for item in t_test: ndarray[item] = ndarray.get(item, 0) + 1#下面必須有一行空行,讓交互式python確認(rèn)for語(yǔ)句完成輸入print(ndarray) #output:{1.0: 16, 2.0: 23, 3.0: 21} #*********************************** #附加內(nèi)容:寫(xiě)一個(gè)循環(huán),從1和n-1到n-1和1來(lái)劃分訓(xùn)練集和驗(yàn)證集; #TODO: 并對(duì)每種劃分應(yīng)用model(此處是樸素貝葉斯分類器-高斯模型)訓(xùn)練后交叉驗(yàn)證; # 交叉驗(yàn)證時(shí)也窮舉所有可能的cv迭代次數(shù); # 收集數(shù)據(jù)并顯示,看此model對(duì)已知數(shù)據(jù)集合的分類最優(yōu)點(diǎn)在哪里? # figure的X是train/data(訓(xùn)練集合占比%)(0,1);Y軸交叉驗(yàn)證mean值的迭代窮舉后均值!(0,1) # 因?yàn)橛?xùn)練集和驗(yàn)證集劃分每次是隨機(jī)的,每RUN一次會(huì)有一張不同的二維圖 #TODO: 進(jìn)一步擴(kuò)展,對(duì)一個(gè)矩陣樣本,能否自動(dòng)的按照一定規(guī)律,窮舉各種算法模型的結(jié)果? # 并能設(shè)定閾值報(bào)警。這樣我們就有個(gè)一個(gè)遍歷所有算法的基礎(chǔ)toolbox,對(duì)原始矩陣樣式的樣本 # 做自動(dòng)auto的掃描,提供基本的信息和情況,然后再人為去研究。 #*********************************** ########################### #(3)聚類 ########################### #k-means算法簡(jiǎn)介:算法接受輸入量k ,并將n個(gè)數(shù)據(jù)對(duì)象分為k個(gè)聚類;獲得的聚類滿足:同一聚類中的對(duì)象相似度較高;不同聚類中對(duì)象相似度低; # 聚類相似度是利用各聚類中對(duì)象的均值所獲得一個(gè)“中心對(duì)象”(引力中心)來(lái)進(jìn)行計(jì)算。 #k-means 算法基本步驟: #(1) 從 n個(gè)數(shù)據(jù)對(duì)象任意選擇k個(gè)對(duì)象作為初始聚類中心(最終期望聚為k類); #(2) 根據(jù)每個(gè)聚類對(duì)象的均值(中心對(duì)象),計(jì)算每個(gè)對(duì)象與這些中心對(duì)象的距離;按最小距離重新對(duì)相應(yīng)對(duì)象進(jìn)行劃分; #(3) 重新計(jì)算每個(gè)(有變化)聚類的均值(中心對(duì)象); #(4) 計(jì)算標(biāo)準(zhǔn)測(cè)度函數(shù),當(dāng)滿足一定條件,如函數(shù)收斂時(shí),則算法終止;如果條件不滿足則回到步驟(2)。 ############################ from sklearn.cluster import KMeans kms = KMeans(n_clusters=3) # initialization 先驗(yàn)知道3種植物,所以設(shè)定引力中心為聚合成3類。 #kmeans = KMeans(k=3, init='random') # both parameters are wrong kms.fit(data) # actual execution c = kms.predict(data)from sklearn.metrics import completeness_score, homogeneity_score print completeness_score(t,c) #output:0.764986151449 print homogeneity_score(t,c) #output:0.751485402199 #特別注意!t中只要是3類值就行,不一定非要1,2,3 #當(dāng)大部分?jǐn)?shù)據(jù)點(diǎn)屬于一個(gè)給定的類并且屬于同一個(gè)群集,那么完整性得分就趨向于1。 #當(dāng)所有群集都幾乎只包含某個(gè)單一類的數(shù)據(jù)點(diǎn)時(shí)同質(zhì)性得分就趨向于1. figure() subplot(211) # top figure with the real classes plot(data[t==1,0],data[t==1,2],'bo') plot(data[t==2,0],data[t==2,2],'ro') plot(data[t==3,0],data[t==3,2],'go') subplot(212) # bottom figure with classes assigned automatically plot(data[c==1,0],data[c==1,2],'bo',alpha=.5) plot(data[c==2,0],data[c==2,2],'go',alpha=.5) plot(data[c==0,0],data[c==0,2],'mo',alpha=.5) show() #觀察此圖我們可以看到,底部左側(cè)的群集可以被k-means完全識(shí)別, #然而頂部的兩個(gè)群集有部分識(shí)別錯(cuò)誤。按照kmean的中心對(duì)象是引力中心的聚類方法 #出現(xiàn)識(shí)別錯(cuò)誤是必然的;樣本的偶然性可能導(dǎo)致識(shí)別錯(cuò)誤#如下是將4個(gè)feature維度組合為2個(gè)點(diǎn)放入一個(gè)平面,也可以看到聚類為3種后, #邊界變得清晰了。 import matplotlib.pyplot as plt plt.figure() plt.subplot(211) # top figure with the real classes plt.plot(data[t==1,0],data[t==1,1],'bo',data[t==1,2],data[t==1,3],'b+') plt.plot(data[t==2,0],data[t==2,1],'ro',data[t==2,2],data[t==2,3],'r+') plt.plot(data[t==3,0],data[t==3,1],'go',data[t==3,2],data[t==3,3],'g+') plt.subplot(212) # bottom figure with classes assigned automatically plt.plot(data[c==0,0],data[c==0,1],'bo',data[c==0,2],data[c==0,3],'b+',alpha=.7) plt.plot(data[c==1,0],data[c==1,1],'ro',data[c==1,2],data[c==1,3],'r+',alpha=.7) plt.plot(data[c==2,0],data[c==2,1],'go',data[c==2,2],data[c==2,3],'g+',alpha=.7) p=plt fig=plt.gcf() fig.show() # p.show()也可,但二者只能執(zhí)行一次。
?
########################### #(4)回歸 ############################回歸是一個(gè)用于預(yù)測(cè)變量之間函數(shù)關(guān)系調(diào)查的方法。 #假設(shè)有兩個(gè)變量:一個(gè)被認(rèn)為是因,一個(gè)被認(rèn)為是果。 #回歸模型描述兩者關(guān)系;從一個(gè)變量推斷另一個(gè)變量; #當(dāng)這種關(guān)系是一條線時(shí),稱為線性回歸。############## #sklear.linear_model模塊中的LinearRegression模型。 #它通過(guò)計(jì)算每個(gè)數(shù)據(jù)點(diǎn)到擬合線的垂直差的平方和, #找到平方和最小的最佳擬合線。類似sklearn模型; # ###############下面舉例隨機(jī)產(chǎn)生了40個(gè)點(diǎn)樣本,但大致函數(shù)趨勢(shì)是 #在第一象限線性增長(zhǎng),用線性回歸來(lái)找出擬合線并評(píng)估 #Step1-隨機(jī)產(chǎn)生第一象限40個(gè)點(diǎn) from numpy.random import rand x = rand(40,1) # explanatory variable y = x*x*x+rand(40,1)/5 # depentend variable#Step2-線性回歸 from sklearn.linear_model import LinearRegression linreg = LinearRegression() linreg.fit(x,y)#Step3-隨機(jī)產(chǎn)生x變量,用線性回歸模型推斷y變量(推斷出來(lái)是一條線) from numpy import linspace, matrix #產(chǎn)生0到1之間40個(gè)樣本值 randx = linspace(0,1,40) #用隨機(jī)產(chǎn)生的40個(gè)x軸樣本,用線性回歸預(yù)測(cè)其y軸樣本,并輸出比較 #推斷y時(shí)先將x當(dāng)做矩陣轉(zhuǎn)置為y再推斷 plot(x,y,'o',randx,linreg.predict(matrix(randx).T),'--r') show()#Step4-通過(guò)測(cè)量MSE指標(biāo)看擬合線與真實(shí)數(shù)據(jù)的距離平方。0最好 from sklearn.metrics import mean_squared_error print mean_squared_error(linreg.predict(x),y) ######################### #針對(duì)本例實(shí)際花萼的長(zhǎng)寬數(shù)據(jù)做線性回歸 ######################### #獲取x和y(需要reshape來(lái)轉(zhuǎn)換數(shù)組(50,)到一維矩陣(50,1),才能做linreg.fit! ssx_blue=data[target=='setosa',0].reshape((50,1)) #獲取setosa的sepal花萼l(xiāng)ength ssy_blue=data[target=='setosa',1].reshape((50,1)) #獲取setosa的sepal花萼width#用x和y獲得線性回歸模型 linreg = LinearRegression() linreg.fit(ssx_blue,ssy_blue)#隨機(jī)產(chǎn)生x變量,用線性回歸模型推斷y變量(推斷出來(lái)是一條線) #根據(jù)經(jīng)驗(yàn)藍(lán)色品種setosa的花萼sepal的長(zhǎng)寬尺寸一般為X:[4.0-6.0]y:[2.5-4.5] randx = linspace(4.0,6.0,50) plot(ssx_blue,ssy_blue,'o',randx,linreg.predict(matrix(randx).T),'--r') show()#通過(guò)測(cè)量MSE指標(biāo)看擬合線與真實(shí)數(shù)據(jù)的距離平方。0最好 print mean_squared_error(linreg.predict(ssx_blue),ssy_blue) ########################### #(5)相關(guān)性分析 ############################通過(guò)研究feature之間的相關(guān)性來(lái)理解變量之間是否相關(guān),相關(guān)強(qiáng)弱。 #相關(guān)性分析幫助定位被依賴的重要變量。最好的相關(guān)方法可能是皮爾遜積矩相關(guān)系數(shù)。 #它是由兩個(gè)變量的協(xié)方差除以它們的標(biāo)準(zhǔn)差的乘積計(jì)算而來(lái)。 #我們將鳶尾花數(shù)據(jù)集的4個(gè)變量?jī)蓛山M合計(jì)算出其相關(guān)性系數(shù)。 #特別說(shuō)明:feature是可以組合與變換的,所以不一定是未處理的初始feature兩兩做相關(guān)性判斷, # 而可能是人為判斷有相關(guān)性的,嘗試組合或變換feature再不斷測(cè)試相關(guān)性。#當(dāng)值一起增長(zhǎng)時(shí)相關(guān)性為正。當(dāng)一個(gè)值減少而另一個(gè)值增加時(shí)相關(guān)性為負(fù)。 #1代表完美的正相關(guān),0代表不相關(guān),-1代表完美的負(fù)相關(guān)。#本例紅色被關(guān)聯(lián)為最高的正相關(guān),可以看出最強(qiáng)相關(guān)是: #“花瓣寬度”petal width和“花瓣長(zhǎng)度”petal length這兩個(gè)變量。 from numpy import corrcoef corr = corrcoef(data.T) # .T gives the transpose print corr #output:[[ 1. -0.10936925 0.87175416 0.81795363] #output: [-0.10936925 1. -0.4205161 -0.35654409] #output: [ 0.87175416 -0.4205161 1. 0.9627571 ] #output: [ 0.81795363 -0.35654409 0.9627571 1. ]]from pylab import pcolor, colorbar, xticks, yticks from numpy import arange pcolor(corr) #添加相關(guān)性矩陣,4個(gè)屬性所以是4x4 colorbar() #添加彩色注釋條 #添加X(jué),Y軸注釋,默認(rèn)一個(gè)屬性是1,坐標(biāo)是1,2,3,4,對(duì)應(yīng)四個(gè)屬性name如下。 xticks(arange(1,5),['sepal length', 'sepal width', 'petal length', 'petal width'],rotation=-20) yticks(arange(1,5),['sepal length', 'sepal width', 'petal length', 'petal width'],rotation=-45) show() ########################### #(6)成分分析(降維) # 涉及算法之一PCA ########################### from sklearn.decomposition import PCA #降維到更少feature(主成分)不僅僅是為了可視化 #雖然3D也可以看,但不直觀,最直觀的是2D平面圖,而4D或更高維人眼無(wú)法觀察 #所以將data中原始4個(gè)feature降維到2維來(lái)觀察。 #特別注意:它等于自動(dòng)的將feature做了算法組合,以期望分離不同種類。 pca = PCA(n_components=2)pcad = pca.fit_transform(data)plot(pcad[target=='setosa',0],pcad[target=='setosa',1],'bo') plot(pcad[target=='versicolor',0],pcad[target=='versicolor',1],'ro') plot(pcad[target=='virginica',0],pcad[target=='virginica',1],'go') show()#查看主成分PC print pca.explained_variance_ratio_ #output: [ 0.92461621 0.05301557] pc1, pc2 = pca.explained_variance_ratio_ #保存2個(gè)PCprint 1-sum(pca.explained_variance_ratio_) #output:0.0223682249752 print 1.0-pc1-pc2 #等價(jià)于上述輸出#逆變換還原數(shù)據(jù) data_inv = pca.inverse_transform(pcad) #比較還原后數(shù)據(jù)和原始數(shù)據(jù)的相似度 print abs(sum(sum(data - data_inv))) #output:6.66133814775e-15#循環(huán)嘗試:PC數(shù)量從1維到4維(原始數(shù)據(jù)也是4維) #看PCA覆蓋信息量;4個(gè)肯定100%,3個(gè)也很高了; for i in range(1,5):pca = PCA(n_components=i)pca.fit(data)print sum(pca.explained_variance_ratio_) * 100,'%'#output:92.4616207174 % #output:97.7631775025 % #output:99.481691455 % #output:100.0 %print "END" #END?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Anita9002/p/7608008.html
總結(jié)
以上是生活随笔為你收集整理的python入门-分类和回归各种初级算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据集加载--load_digits
- 下一篇: Python基础【day02】:元组和购