分類(lèi)
? 什么是分類(lèi)
– 分類(lèi)模型:
輸入樣本的屬性值,輸出對(duì)應(yīng)的類(lèi)別,將每個(gè)樣本映射到預(yù)先定義好的類(lèi)別
? 常用分類(lèi)算法
– Knn算法
– 決策樹(shù)
– 貝葉斯分類(lèi)器
– 支持向量機(jī)
– 神經(jīng)網(wǎng)絡(luò)
5種算法!!
分類(lèi):分為娛樂(lè)新聞、民生新聞、
識(shí)別到各個(gè)類(lèi)別之間的差距,對(duì)于新給的一個(gè)新聞,根據(jù)歷史信息預(yù)測(cè)到它的類(lèi)別
有監(jiān)督的學(xué)習(xí):類(lèi)別是已經(jīng)確定的
根據(jù)訓(xùn)練集數(shù)據(jù)模型的創(chuàng)建、模型的使用
類(lèi)別是給定的
距離
最近鄰算法Knn
? 算法主要思想:
1 選取k個(gè)和待分類(lèi)點(diǎn)距離最近的樣本點(diǎn)
2 看1中的樣本點(diǎn)的分類(lèi)情況,投票決定待分類(lèi)點(diǎn)所屬的類(lèi)
先看看自己身邊的朋友是怎么樣的。
k=3歸為紅色類(lèi)
k=5歸為藍(lán)色類(lèi)
但是沒(méi)有給出k到底取多少
距離的概念
歐式距離 直線間距離
馬氏距離 點(diǎn)與點(diǎn)的相似度
貝葉斯分類(lèi)器
貝葉斯公式:條件概率
原理:不知道確切的分類(lèi),但是可以看到表現(xiàn)出來(lái)的屬性
到底 落在分布1的概率高還是落在分布2的概率高
根據(jù) 先決條件 ,判斷樣本是落在哪一類(lèi)的
要求屬性之間相互獨(dú)立
可能會(huì)有一些因果關(guān)系的存在
根據(jù)所表現(xiàn)出來(lái)的,反推出它歸于某一個(gè)類(lèi)的概率
貝葉斯網(wǎng)絡(luò)也適用于多分類(lèi)的情況
決策樹(shù) decision tree
? 什么是決策樹(shù)
? 輸入:學(xué)習(xí)集
? 輸出:分類(lèi)規(guī)則(決策樹(shù))
? 樹(shù)中每一個(gè)非葉節(jié)點(diǎn)表示一個(gè)決策,該決策的值導(dǎo)致不同的決策結(jié)果(葉節(jié)點(diǎn))或者影 響后面的決策選擇。
? 根據(jù)給定的未知分類(lèi)的元組X,根據(jù)其屬性值跟蹤一條由根節(jié)點(diǎn)到葉節(jié)點(diǎn)的路徑,該 葉節(jié)點(diǎn)就是該元組的分類(lèi)結(jié)果預(yù)測(cè)。
常見(jiàn)的決策樹(shù)算法有:
? ID3(->C4.5->C5.0)
?CART(Classification And Regression Tree)
這兩類(lèi)算法的主要區(qū)別在于
分裂屬性時(shí)的選擇方法
。
在構(gòu)建決策樹(shù)時(shí),這兩類(lèi)算法的流程基本一樣,都采用 貪心方法,自頂而下遞歸構(gòu)建決策樹(shù)。
名詞解釋
? 數(shù)據(jù)分區(qū)D
代表了節(jié)點(diǎn)上的數(shù)據(jù)
? 元組屬性列表
? 屬性A
? 結(jié)點(diǎn)N
? 類(lèi)別C
貪心算法構(gòu)建決策樹(shù)
? 1.創(chuàng)建一個(gè)結(jié)點(diǎn)N。
如果D中的元組都在同一個(gè)類(lèi)別C中,則N作為葉結(jié)點(diǎn),以C標(biāo)記;
如果屬性列表為空,則N作為葉節(jié)點(diǎn),以D中最多的類(lèi)別C作為標(biāo)記。
? 2.根據(jù)分裂準(zhǔn)則找出“最好”的分裂屬性A,并用該分裂屬性標(biāo)記N。
1)A是離散的,則 A的每個(gè)已知值都產(chǎn)生一個(gè)分支;
2)A是連續(xù)的,則產(chǎn)生A≤s和A>s兩個(gè)分支;
3)若A是連續(xù)的,并且必須產(chǎn)生二叉樹(shù),則產(chǎn)生A∈A1和A∈A2兩個(gè)分支,其中A1,A2非空且 A1∪A2=A
? 3.若給定的分支中的元組非空,對(duì)于D的每一個(gè)分支Dj,重復(fù)步驟1,2
屬性選擇度量
? 如果我們根據(jù)分裂準(zhǔn)則把D劃分為較小的分區(qū),最好的情況是每個(gè)分區(qū)都是純的,即落 在一個(gè)給定分區(qū)的所有元組都是相同的類(lèi)。最好的分裂準(zhǔn)則就是
令到每個(gè)分區(qū)盡量的純。
? 屬性選擇度量給學(xué)習(xí)集中的每個(gè)屬性提供了評(píng)定。具有最好度量得分的屬性被選為
分裂 屬性
。
熵
? ID3系列算法:基于熵
? 1948年,香農(nóng)提出了“信息熵”的概念,解決了對(duì)系統(tǒng)信息的量化度量問(wèn)題。
ID3——信息增益
? 信息增益定義為原來(lái)的信息需求與新的信息需求之間的差,即
? Gain(A)=Info(D)-InfoA(D)
? Gain(A)表示知道A的值而導(dǎo)致的信息需求的期望減少。 ? 選擇具有最大信息增益的屬性作為分裂屬性
連續(xù)值的信息增益
? 對(duì)于連續(xù)值屬性A,要計(jì)算它的信息增益,其實(shí)也等價(jià)于尋找A的“最佳”分裂點(diǎn)。
? 1.將A的值按遞增排序
?2. 每對(duì)相鄰值的中點(diǎn)(v個(gè))是一個(gè)可能的分裂點(diǎn)。將A按照這些分裂點(diǎn)做v-1次劃分,
計(jì)算每次劃分的InfoA(D)
? 3.選擇具有最小期望信息需求的點(diǎn)作為A的分裂點(diǎn),并根據(jù)該分裂點(diǎn)計(jì)算A的信息增益
ID3算法的缺陷
? 信息增益存在著一定的局限性,它會(huì)傾向于選擇具有大量值的屬性,但是有時(shí)候這種屬 性對(duì)分類(lèi)其實(shí)沒(méi)有多大作用。
例如每個(gè)學(xué)生的學(xué)號(hào)對(duì)其成績(jī)高低的分類(lèi)沒(méi)有作用,但是 如果利用信息增益來(lái)選擇分裂屬性,學(xué)號(hào)這一屬性的劃分會(huì)導(dǎo)致大量分區(qū),每一個(gè)分區(qū) 都只有一個(gè)學(xué)生所以每個(gè)分區(qū)都是純的,但是這樣的劃分對(duì)分辨學(xué)生成績(jī)的高低并沒(méi)有 用。
C4.5——增益率
CART
與ID3算法的差異:
1.不是基于信息熵,而是基于
不純度
來(lái)評(píng)定屬性
2.嚴(yán)格的二元?jiǎng)澐帧J褂肐D3算法有可能會(huì)產(chǎn)生多叉樹(shù),但是使用CART算法只產(chǎn)生
二叉樹(shù)
3.根據(jù)y值類(lèi)型的不同可分為
回歸樹(shù)
和
分類(lèi)樹(shù)
連續(xù)變量。回歸樹(shù)
離散變量。分類(lèi)樹(shù)
分類(lèi)樹(shù)和回歸樹(shù)
? 分類(lèi)樹(shù):y值是
類(lèi)別
? 回歸樹(shù):y值是
實(shí)數(shù)
? 異同:1.所用算法思路一致
? 2.評(píng)定分裂標(biāo)準(zhǔn)不一樣
分類(lèi)樹(shù)
回歸樹(shù)
? 將空間中的點(diǎn)劃分成不同的區(qū)域,同一個(gè) 區(qū)域中的點(diǎn)擁有相同的水平
例子
? Hitters數(shù)據(jù)集
? 根據(jù)籃球球員的各種 數(shù)據(jù)來(lái)預(yù)測(cè)籃球員的 薪酬的對(duì)數(shù)值(log salary)
樹(shù)的修剪
? 為什么要修剪:避免過(guò)度擬合,簡(jiǎn)化模型
? 兩種修剪方法:先剪枝與后剪枝
? 先剪枝:通過(guò)設(shè)定一定的閥值來(lái)停止樹(shù)的生長(zhǎng)
例如,在構(gòu)建樹(shù)模型時(shí),使用信息增益、基尼指數(shù)來(lái)度量劃分的優(yōu)劣。可以 預(yù)先設(shè)定一個(gè)閥值,當(dāng)劃分一個(gè)結(jié)點(diǎn)的元組到時(shí)低于預(yù)設(shè)的閥值時(shí),停止改 子集的劃分
? 后剪枝:等樹(shù)完全生成后再通過(guò)刪除結(jié)點(diǎn)去修剪決策樹(shù)。由于先剪枝中,選擇合適的 閥值存在一定的困難,所以后剪枝更加常用
后剪枝
決策樹(shù)的優(yōu)缺點(diǎn)
? 優(yōu)點(diǎn):
?1. 樹(shù)模型十分通俗易懂,解釋起來(lái)簡(jiǎn)單明了
?2. 相對(duì)于其他模型,樹(shù)模型可以通過(guò)圖形模型展示,即使不具備相應(yīng)專業(yè)知識(shí)的人可以一名了然
?3.樹(shù)模型可以直接處理
定性變量
,不需要增加虛擬變量
? 缺點(diǎn):
?
準(zhǔn)確率不夠高
從線性判別法說(shuō)起
? 用
一條直線
來(lái)劃分學(xué)習(xí)集(這條直線一定存在嗎?)
? 然后根據(jù)
待測(cè)點(diǎn)在直線的哪一邊
決定它的分類(lèi)
支持向量機(jī)SVM
? 支持向量機(jī)SVM
– 原創(chuàng)性(非組合)的具有明顯直觀幾何意義的分類(lèi)算法,具有較高的準(zhǔn)確率
– 思想直觀,但細(xì)節(jié)異常復(fù)雜,內(nèi)容涉及
凸分析算法,核函數(shù),神經(jīng)網(wǎng)絡(luò)
等高深的領(lǐng)域,幾乎可以寫(xiě)成單獨(dú)的大部頭與著。大部分非與業(yè)人士會(huì)覺(jué)得難以理解。
? 兩種情況
– 簡(jiǎn)單情況:線性可分,把問(wèn)題轉(zhuǎn)化為一個(gè)凸優(yōu)化問(wèn)題,可以用
拉格朗日乘子法
簡(jiǎn)化,然后用既有的算法解決
– 復(fù)雜情況:線性不可分,用映射函數(shù)
將樣本投射到高維空間
,使其變成線性可分的情形。利用
核函數(shù)
來(lái)減少高維 度計(jì)算量
? 最優(yōu)分隔平面
最大邊緣超平面(MMH)
非線性情況
代碼
# -*- coding: utf-8 -*-
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import classification_report
from sklearn.naive_bayes import BernoulliNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cross_validation import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
####knn最鄰近算法####
inputfile = 'd:/data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序號(hào)') #導(dǎo)入數(shù)據(jù)
#數(shù)據(jù)是類(lèi)別標(biāo)簽,要將它轉(zhuǎn)換為數(shù)據(jù)
#用1來(lái)表示“好”、“是”、“高”這三個(gè)屬性,用-1來(lái)表示“壞”、“否”、“低”
data[data == u'好'] = 1
data[data == u'是'] = 1
data[data == u'高'] = 1
data[data != 1] = -1
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)
#拆分訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2)
#訓(xùn)練KNN分類(lèi)器
clf = KNeighborsClassifier(algorithm='kd_tree')
clf.fit(x_train, y_train)
#測(cè)試結(jié)果
answer = clf.predict(x_test)
print(x_test)
print(answer)
print(y_test)
print(np.mean( answer == y_test))
#準(zhǔn)確率
precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train))
print(classification_report(y_test, answer, target_names = ['高', '低']))
####貝葉斯分類(lèi)器####
#訓(xùn)練貝葉斯分類(lèi)器
clf = BernoulliNB()
clf.fit(x_train,y_train)
#測(cè)試結(jié)果
answer = clf.predict(x_test)
print(x_test)
print(answer)
print(y_test)
print(np.mean( answer == y_test))
print(classification_report(y_test, answer, target_names = ['低', '高']))
####決策樹(shù)####
from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy') #建立決策樹(shù)模型,基于信息熵
dtc.fit(x_train, y_train) #訓(xùn)練模型
#導(dǎo)入相關(guān)函數(shù),可視化決策樹(shù)。
#導(dǎo)出的結(jié)果是一個(gè)dot文件,需要安裝Graphviz才能將它轉(zhuǎn)換為pdf或png等格式。
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
with open("tree.dot", 'w') as f:
f = export_graphviz(dtc, out_file = f)
#測(cè)試結(jié)果
answer = dtc.predict(x_test)
print(x_test)
print(answer)
print(y_test)
print(np.mean( answer == y_test))
print(classification_report(y_test, answer, target_names = ['低', '高']))
####SVM####
from sklearn.svm import SVC
clf =SVC()
clf.fit(x_train, y_train)
#測(cè)試結(jié)果
answer = clf.predict(x_test)
print(x_test)
print(answer)
print(y_test)
print(np.mean( answer == y_test))
print(classification_report(y_test, answer, target_names = ['低', '高']))
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
