數據挖掘——基於sklearn包的分類算法小結

  

        目錄node

1、分類算法簡介python

2、KNN算法算法

3、貝葉斯分類算法dom

4、決策樹算法機器學習

5、隨機森林算法分佈式

6、SVM算法函數

 

 

 1、分類算法簡介oop

一、概念學習

  1.1 監督學習(Supervised Learning)測試

  從給定標註(訓練集有給出明確的因變量Y)的訓練數據集中學習出一個函數,根據這個函數爲新數據進行標註。

  1.2 無監督學習(Unsupervised Learning)

  從給定無標註(訓練集無明確的因變量Y)的訓練數據中學習出一個函數,根據這個函數爲全部數據標註。

  1.3 分類 (Classification)

  分類算法經過對已知類別訓練數據集的分析,從中發現分類規則,以此預測新數據的類別,分類算法屬於監督學習

 

二、經常使用的分類算法

  • KNN算法(K-近鄰分類算法)
  • 貝葉斯算法
  • 決策樹算法
  • 隨機森林算法
  • SVM算法(支持向量機)

三、分類問題的驗證方法

 

交叉驗證(Cross Validation):訓練集與測試集

 

K折交叉驗證(K-fold Cross Validation):設置k=10,那麼咱們把原來的數據集隨機分爲10份,分別爲{D1,D2,D3...D10}

 

接着,使用D1做爲測試集,{D2,D3...D10}做爲訓練集,計算得分S1

 

           使用D2做爲測試集,{D1,D3...D10}做爲訓練集,計算得分S2

 

.........

 

最後,使用D10做爲測試集,{D1,D2...D9}做爲訓練集,計算得分S10

 

計算{S1,S2,...,S10}的平均值,做爲模型的綜合評分

 

 2、KNN算法

一、KNN算法簡介

  K近鄰分類算法(k-Nearest Neighbors):從訓練集中找到和新數據最接近的K條記錄,而後根據他們的主要分類來決定新數據的類別。

  KNN算法屬於最簡單的機器學習算法之一,核心思想是每一個樣本均可以用它最接近的k個鄰近值來表明,即若是一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具備這個類別上樣本的特性。因此KNN算法的結果很大程度商取決於K的選擇。

 

二、算法的優缺點

  2.1 優勢

  • 簡單,易於理解,易於實現,無需估計參數,無需訓練
  • 適合對稀有事件進行分類
  • 特別適用於多分類問題(對象具備多個分類標籤,比SVM表現更好)

  2.2 缺點

  • 當樣本不平衡時(一個類樣本容量很大,其餘類樣本容量很小),該樣本的K個鄰居中大容量類的樣本佔多數
  • 計算量較大,由於對每個待分類的文本,都要計算它到全體已知樣本的距離
  • 針對結果沒法給出像決策樹那樣的規則

三、python中的實現過程

  以iris數據集爲例,基於python中sklearn包實現KNN分類 

  【iris數據集:經常使用的分類實驗數據集,即鳶尾花卉數據集,是一個多重變量數據集,經過包含的4個屬性(花萼長度、花萼寬度、花瓣長度、花瓣寬度)來預測屬於三類鳶尾花中的哪一類。】

  #python的sklearn包中自帶了iris數據集

from sklearn import datasets

iris = datasets.load_iris()

  獲得如下類型的數據,共有150行,包含特徵屬性(feature_names)、特徵數據(data)、目標分類名稱(target_names)、目標類別(target)

  KNN分類建模的具體代碼:

#切分訓練集
from sklearn.model_selection import train_test_split
#將數據集按7:3切分爲訓練集和測試集(特徵變量和目標變量)
data_train, data_test, target_train, target_test = train_test_split(
        iris.data,  #特徵數據
        iris.target,  #目標數據
        test_size=0.3)  #測試集佔比

#  KNN建模(1折交叉驗證)
from sklearn import neighbors
knnmodel = neighbors.KNeighborsClassifier(n_neighbors=3) #n_neighbors參數爲分類個數

knnmodel.fit(data_train,target_train)

knnmodel.score(data_train,target_train)

# 5折交叉驗證
from sklearn.model_selection import cross_val_score
#cross_val_score函數傳入模型、特徵數據、目標數據和  K值
cross_val_score(knnmodel,iris.data,iris.target,cv=5)

#模型預測,獲得分類結果
knnmodel.predict([[0.1,0.2,0.3,0.4]]) 

 

3、貝葉斯分類算法

一、貝葉斯分類算法簡介

  貝葉斯分類算法(NB):是統計學的一種分類方法,它是利用貝葉斯定理的機率統計知識,對離散型數據進行分類的算法。

  樸素貝葉斯(Naive Bayes Classifier)的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的機率,哪一個最大,就認爲此待分類項屬於哪一個類別

  貝葉斯定理:  formula

  tips:python中sklearn包的naive_bayes模塊中,有三種貝葉斯算法類型:

  • GaussuanNB   高斯貝葉斯 :適用於特徵值符合正態分佈的數據,不須要知道具體每一個樣本的數值,只需知道樣本符合什麼樣的正態分佈(均值、方差)便可計算;
  • BernoulliNB  伯努利貝葉斯:適用於特徵值符合伯努利分佈的數據,便是/否,0/1;
  • MultinomialNB  多項式貝葉斯:不知道特徵值符合哪一種分佈的時候,使用多項式貝葉斯算法計算每一個特徵的機率,因此須要知道每一個特徵值的數值大小(最經常使用於文本分類)。

 

 

二、算法的優缺點

  2.1 優勢

  • 方法簡單,分類準確率高
  • 在接受大數據量訓練和查詢時速度快

  2.2 缺點

  • 因爲貝葉斯定理假設一個屬性值對給定類的影響獨立於其它屬性的值,而此假設在實際狀況中常常是不成立的,所以其分類準確率可能會降低,即沒法處理基於特徵組合所產生的變化結果

三、python中的實現過程

  使用多項式貝葉斯算法進行文本分類的 

     #創建含多篇文本的語料庫,並指定文本類別——文本分詞——文本向量化

     #多項式貝葉斯建模 

from sklearn.naive_bayes import MultinomialNB
#多項式貝葉斯分類模型創建
MNBmodle = MultinomialNB()
#將文本向量做爲特徵值傳入,將分類序列做爲目標序列傳入
MNBmodle.fit(textVector,corpos['class'])
MNBmodle.score(textVector,corpos['class'])

  #傳入新文本,向量化後進行分類預測

#傳入新文本進行分類測試
newTexts = ['''
據介紹,EliteBook 840 G4是一款採用14英寸1080p屏幕的商務筆記本,
硬件配置方面,入門級的EliteBook 840 G4搭載Intel Core i3-7100處理器,
配備4GB內存和500GB機械硬盤,預裝Windows 10操做系統。
高端機型可選擇更大容量的內存和SSD固態硬盤。
機身四周提供了USB 3.0、USB-C、DisplayPort、15針迷你D-Sub,
支持藍牙4.2和802.11ac Wi-Fi。
整機重1.48千克。
''']
#對新內容分詞
for i in range(len(newTexts)):
    newTexts[i] = " ".join(jieba.cut(newTexts[i]))
#新內容的文本向量
newTextVector = countVectorizer.transform(newTexts)
#進行預測
MNBmodle.predict(newTextVector)

 

4、決策樹算法

一、決策樹算法簡介

  決策樹算法(Decision Tree):經過對訓練樣本的學習,並創建分類規則,而後依據分類規則,對新樣本數據進行分類預測。

  決策樹是在已知各類狀況發生機率的基礎上,經過構成決策樹來求取淨現值的指望值大於等於零的機率,評價項目風險,判斷其可行性的決策分析方法,是直觀運用機率分析的一種圖解法。

     決策樹是一種樹形結構,其中每一個內部節點表示一個屬性上的測試,每一個分支表明一個測試輸出,每一個葉節點表明一種類別。

 

二、算法的優缺點

  2.1 優勢

  • 易於理解和實現
  • 可同時處理數值型和非數值型數據

  2.2 缺點

  • 對連續性的字段較難預測
  • 對有時間順序的數據,須要不少的預處理工做
  • 當類別較多時,錯誤可能增長的比較快

三、python中的實現過程

  基於sklearn包的決策樹建模 

  #將訓練集中的離散變量虛擬化

dummycolumns = ['data3','data4']

for column in dummycolumns:
    data[column] = data[column].astype('category')

dummydata = pd.get_dummies(data,
                           columns=dummycolumns,
                           prefix=dummycolumns,
                           prefix_sep='=',
                           drop_first=True)

  #構建模型

#特徵變量
fdata = dummydata[['data1','data2','data3_dummy','data_dummy']]
#目標變量
tdata = dummydata['target']
#構建模型
from sklearn.tree import DecisionTreeClassifier
dtmodel = DecisionTreeClassifier(max_leaf_nodes=8) #最大葉數爲8
#模型驗證
from sklearn.model_selection import cross_val_score
cross_val_score(dtmodel,fdata,tdata,cv=10)  #交叉驗證10次
#模型訓練
dtmodel.fit(fdata,tdata)

  #繪製決策樹圖(須要下載安裝graphviz軟件 並 安裝pydot包,可參考http://wenda.chinahadoop.cn/question/5518

from sklearn.tree import export_graphviz
with open(r'D:\...\data.dot','w') as f:
    f = export_graphviz(dtmodel, out_file=f)

import pydot
from sklearn.externals.six import StringIO

dot_data = StringIO()
export_graphviz(
        dtmodel, #模型名稱
        out_file=dot_data,  #圖形數據的輸出路徑
        class_names=['A','B'],  #目標屬性的名稱
        feature_names=['a','b','c','d'],  #特徵屬性的名稱
        filled=True, #是否使用顏色填充
        rounded=True, #邊框是否圓角
        special_characters=True) #是否有特殊字符(含中文就算)

graph = pydot.graph_from_dot_data(dot_data.getvalue())

graph.get_node('node')[0].set_fontname('Microsoft YaHei') 

graph.write_png(r'D:\...\決策樹.png') #輸出圖形

最終獲得以下圖的決策樹:

 

 

5、隨機森林算法

一、隨機森林算法簡介

  隨機森林(RandomForest):是一個包含多個決策樹的分類器,而且其輸出的類別是由個別樹輸出的類別的衆數而定。

  隨機森林幾乎能預測任何數據類型的問題,它是一個相對較新的機器學習方法。

二、算法的優缺點

  2.1 優勢

  • 適合離散型和連續型的屬性數據
  • 對海量數據,儘可能避免了過分擬合的問題
  • 對高緯度數據(文本或語音類型的數據),不會出現特徵選擇困難的問題
  • 實現簡單,訓練速度快,適合進行分佈式計算

  2.2 缺點

  • 隨機森林已經被證實在某些噪音較大的分類或迴歸問題上會過擬

  • 對於有不一樣取值的屬性的數據,取值劃分較多的屬性會對隨機森林產生更大的影響,因此隨機森林在這種數據上產出的屬性權值是不可信的。

三、python中的實現過程 

  #因爲隨機森林基於決策樹算法,因此數據處理步驟與決策樹算法相同

  #模型構建

#模型構建
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

#比較決策樹模型和隨機森林模型的評分好壞
dtmodel = DecisionTreeClassifier()
dtscroe = cross_val_score(dtmodel,fdata,tdata,cv=10)
dtscroe.mean() 

rfcmodel = RandomForestClassifier()
rfcscore = cross_val_score(rfcmodel,fdata,tdata,cv=10)
rfcscore.mean() #評分優於決策樹算法

  #隨機森林模型評分存在閾值,當決策樹算法通過參數調優後,模型評分能夠達到該閾值

#進行參數調優
dtmodel = DecisionTreeClassifier(max_leaf_nodes=8)
dtscroe = cross_val_score(dtmodel,fdata,tdata,cv=10)
dtscroe.mean()  #評分明顯提升

rfcmodel = RandomForestClassifier(max_leaf_nodes=8)
rfcscore = cross_val_score(rfcmodel,fdata,tdata,cv=10)
rfcscore.mean()  #基本與決策樹一致

 

6、SVM算法

一、SVM算法簡介  

  支持向量機(Support Vector Machine,即SVM)是一種二分類算法,屬於通常化線性分類器,這類分類器的特色是可以同時最小化經驗偏差與最大化幾何邊緣區,所以SVM也被稱爲最大邊緣區分類器

  其主要思想爲找到空間中的一個可以將全部數據樣本劃開的超平面,而且使得樣本集中全部數據到這個超平面的距離最短

  它在解決小樣本、非線性及高維模式識別中表現出許多特有的優點,並可以推廣應用到函數擬合等其餘機器學習問題中

 

二、算法的優缺點

  2.1 優勢

  • SVM 的最終決策函數只由少數的支持向量所肯定,計算的複雜性取決於支持向量的數目,而不是樣本空間的維數,這在某種意義上避免了「維數災難」
  • 少數支持向量決定了最終結果,這不但能夠幫助咱們抓住關鍵樣本、「剔除」大量冗餘樣本
  • 對小樣本、非線性及高維模式識別中表現出許多特有的優點

  2.2 缺點

  • SVM算法對大規模訓練樣本難以實施

  •  用SVM解決多分類問題存在困難

 

三、python中的實現過程 

  python中SVM模型能夠分爲三種:svm.LinearSVC、svm.NuSVC、svm.SVC

  #根據數據構建簡單SVM模型(無參數調優)

 

from sklearn import svm
from sklearn import cross_validation
#根據三種方式分別建模,獲得模型評分
svmmodel1 =  svm.SVC()  
cross_validation.cross_val_score(svmmodel1,fdata,tdata,cv=3)

svmmodel2 = svm.NuSVC()
cross_validation.cross_val_score(svmmodel2,fdata,tdata,cv=3)

svmmodel3 = svm.LinearSVC()
cross_validation.cross_val_score(svmmodel3,fdata,tdata,cv=3)
#LinearSVC 評分最好,因此使用該方法建模

svmmodel = svm.LinearSVC()
svmmodel.fit(fdata,tdata)
svmmodel.score(fdata,tdata)
相關文章
相關標籤/搜索