目錄
一、分類算法簡介
二、KNN算法
三、貝葉斯分類算法
四、決策樹算法
五、隨機森林算法
六、SVM算法
一、分類算法簡介
1、概念
1.1 監督學習(Supervised Learning)
從給定標注(訓練集有給出明確的因變量Y)的訓練數據集中學習出一個函數,根據這個函數為新數據進行標注。
1.2 無監督學習(Unsupervised Learning)
從給定無標注(訓練集無明確的因變量Y)的訓練數據中學習出一個函數,根據這個函數為所有數據標注。
1.3 分類 (Classification)
分類算法通過對已知類別訓練數據集的分析,從中發現分類規則,以此預測新數據的類別,分類算法屬於監督學習。
2、常用的分類算法
- KNN算法(K-近鄰分類算法)
- 貝葉斯算法
- 決策樹算法
- 隨機森林算法
- SVM算法(支持向量機)
3、分類問題的驗證方法
二、KNN算法
1、KNN算法簡介
K近鄰分類算法(k-Nearest Neighbors):從訓練集中找到和新數據最接近的K條記錄,然后根據他們的主要分類來決定新數據的類別。
KNN算法屬於最簡單的機器學習算法之一,核心思想是每個樣本都可以用它最接近的k個鄰近值來代表,即如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。所以KNN算法的結果很大程度商取決於K的選擇。
2、算法的優缺點
2.1 優點
- 簡單,易於理解,易於實現,無需估計參數,無需訓練
- 適合對稀有事件進行分類
- 特別適用於多分類問題(對象具有多個分類標簽,比SVM表現更好)
2.2 缺點
- 當樣本不平衡時(一個類樣本容量很大,其他類樣本容量很小),該樣本的K個鄰居中大容量類的樣本占多數
- 計算量較大,因為對每一個待分類的文本,都要計算它到全體已知樣本的距離
- 針對結果無法給出像決策樹那樣的規則
3、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]])
三、貝葉斯分類算法
1、貝葉斯分類算法簡介
貝葉斯分類算法(NB):是統計學的一種分類方法,它是利用貝葉斯定理的概率統計知識,對離散型數據進行分類的算法。
朴素貝葉斯(Naive Bayes Classifier)的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。
貝葉斯定理:
tips:python中sklearn包的naive_bayes模塊中,有三種貝葉斯算法類型:
- GaussuanNB 高斯貝葉斯 :適用於特征值符合正態分布的數據,不需要知道具體每個樣本的數值,只需知道樣本符合什么樣的正態分布(均值、方差)即可計算;
- BernoulliNB 伯努利貝葉斯:適用於特征值符合伯努利分布的數據,即是/否,0/1;
- MultinomialNB 多項式貝葉斯:不知道特征值符合哪種分布的時候,使用多項式貝葉斯算法計算每個特征的概率,所以需要知道每個特征值的數值大小(最常用於文本分類)。
2、算法的優缺點
2.1 優點
- 方法簡單,分類准確率高
- 在接受大數據量訓練和查詢時速度快
2.2 缺點
- 由於貝葉斯定理假設一個屬性值對給定類的影響獨立於其它屬性的值,而此假設在實際情況中經常是不成立的,因此其分類准確率可能會下降,即無法處理基於特征組合所產生的變化結果
3、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)
四、決策樹算法
1、決策樹算法簡介
決策樹算法(Decision Tree):通過對訓練樣本的學習,並建立分類規則,然后依據分類規則,對新樣本數據進行分類預測。
決策樹是在已知各種情況發生概率的基礎上,通過構成決策樹來求取凈現值的期望值大於等於零的概率,評價項目風險,判斷其可行性的決策分析方法,是直觀運用概率分析的一種圖解法。
決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別。
2、算法的優缺點
2.1 優點
- 易於理解和實現
- 可同時處理數值型和非數值型數據
2.2 缺點
- 對連續性的字段較難預測
- 對有時間順序的數據,需要很多的預處理工作
- 當類別較多時,錯誤可能增加的比較快
3、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') #輸出圖形
最終得到如下圖的決策樹:
五、隨機森林算法
1、隨機森林算法簡介
隨機森林(RandomForest):是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。
隨機森林幾乎能預測任何數據類型的問題,它是一個相對較新的機器學習方法。
2、算法的優缺點
2.1 優點
- 適合離散型和連續型的屬性數據
- 對海量數據,盡量避免了過度擬合的問題
- 對高緯度數據(文本或語音類型的數據),不會出現特征選擇困難的問題
- 實現簡單,訓練速度快,適合進行分布式計算
2.2 缺點
-
隨機森林已經被證明在某些噪音較大的分類或回歸問題上會過擬
-
對於有不同取值的屬性的數據,取值划分較多的屬性會對隨機森林產生更大的影響,所以隨機森林在這種數據上產出的屬性權值是不可信的。
3、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() #基本與決策樹一致
六、SVM算法
1、SVM算法簡介
支持向量機(Support Vector Machine,即SVM):是一種二分類算法,屬於一般化線性分類器,這類分類器的特點是能夠同時最小化經驗誤差與最大化幾何邊緣區,因此SVM也被稱為最大邊緣區分類器。
其主要思想為找到空間中的一個能夠將所有數據樣本划開的超平面,並且使得樣本集中所有數據到這個超平面的距離最短
它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函數擬合等其他機器學習問題中
2、算法的優缺點
2.1 優點
- SVM 的最終決策函數只由少數的支持向量所確定,計算的復雜性取決於支持向量的數目,而不是樣本空間的維數,這在某種意義上避免了“維數災難”
- 少數支持向量決定了最終結果,這不但可以幫助我們抓住關鍵樣本、“剔除”大量冗余樣本
- 對小樣本、非線性及高維模式識別中表現出許多特有的優勢
2.2 缺點
-
SVM算法對大規模訓練樣本難以實施
-
用SVM解決多分類問題存在困難
3、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)