【火爐煉AI】機(jī)器學(xué)習(xí)014-用SVM構(gòu)建非線性分類模型

【火爐煉AI】機(jī)器學(xué)習(xí)014-用SVM構(gòu)建非線性分類模型

(本文所使用的Python庫(kù)和版本號(hào): Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

支持向量機(jī)(Support Vector Machine,SVM)是一種常見的判別方法吓坚,其基本模型是在特征空間上找到最佳的分離超平面,使得數(shù)據(jù)集上的正負(fù)樣本間隔最大溺欧。SVM用來解決二分類問題的有監(jiān)督學(xué)習(xí)算法,其可以解決線性問題整袁,也可以通過引入核函數(shù)的方法來解決非線性問題告丢。

本項(xiàng)目旨在使用SVM構(gòu)建非線性分類模型來判別數(shù)據(jù)集的不同類別。


1. 準(zhǔn)備數(shù)據(jù)集

首先來加載和查看數(shù)據(jù)集的一些特性慨灭。如下代碼加載數(shù)據(jù)集并查看其基本信息

# 準(zhǔn)備數(shù)據(jù)集
data_path='E:\PyProjects\DataSet\FireAI/data_multivar_2_class.txt'
df=pd.read_csv(data_path,header=None)
# print(df.head()) # 沒有問題
print(df.info()) # 查看數(shù)據(jù)信息,確保沒有錯(cuò)誤
dataset_X,dataset_y=df.iloc[:,:-1],df.iloc[:,-1]
# print(dataset_X.head())
# print(dataset_X.info())
# print(dataset_y.head()) # 檢查沒問題
dataset_X=dataset_X.values
dataset_y=dataset_y.values

-------------------------------------輸---------出--------------------------------

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 300 entries, 0 to 299
Data columns (total 3 columns):
0 300 non-null float64
1 300 non-null float64
2 300 non-null int64
dtypes: float64(2), int64(1)
memory usage: 7.1 KB
None

--------------------------------------------完-------------------------------------

從上面的df.info()函數(shù)的結(jié)果可以看出球及,這個(gè)數(shù)據(jù)集有兩個(gè)特征屬性(0,1列氧骤,連續(xù)的float類型),一個(gè)標(biāo)記(2列吃引,離散的int型筹陵,只有兩個(gè)類別),每一列都沒有缺失值镊尺。然后來看看這個(gè)數(shù)據(jù)集中數(shù)據(jù)點(diǎn)的分布情況朦佩,如下圖所示:

# 數(shù)據(jù)集可視化
def visual_2D_dataset(dataset_X,dataset_y):
    '''將二維數(shù)據(jù)集dataset_X和對(duì)應(yīng)的類別dataset_y顯示在散點(diǎn)圖中'''
    assert dataset_X.shape[1]==2,'only support dataset with 2 features'
    plt.figure()
    classes=list(set(dataset_y)) 
    markers=['.',',','o','v','^','<','>','1','2','3','4','8'
             ,'s','p','*','h','H','+','x','D','d','|']
    colors=['b','c','g','k','m','w','r','y']
    for class_id in classes:
        one_class=np.array([feature for (feature,label) in 
                   zip(dataset_X,dataset_y) if label==class_id])
        plt.scatter(one_class[:,0],one_class[:,1],marker=np.random.choice(markers,1)[0],
                    c=np.random.choice(colors,1)[0],label='class_'+str(class_id))
    plt.legend()
    
visual_2D_dataset(dataset_X,dataset_y)
數(shù)據(jù)集中數(shù)據(jù)點(diǎn)的分布情況

我以前的很多文章都講到了數(shù)據(jù)集的處理,拆分庐氮,準(zhǔn)備等语稠,此處的數(shù)據(jù)集比較簡(jiǎn)單,故而簡(jiǎn)單講述一下弄砍。


2. 用SVM構(gòu)建線性分類器

你沒有看錯(cuò)仙畦,我就是想用SVM構(gòu)建一個(gè)線性分類器來判別這個(gè)數(shù)據(jù)集。當(dāng)然音婶,即使是入門級(jí)的機(jī)器學(xué)習(xí)攻城獅們慨畸,也能看出,這個(gè)數(shù)據(jù)集是一個(gè)線性不可分類型桃熄,需要用非線性分類器來解決先口。所以型奥,此處瞳收,我就用線性分類器來擬合一下,看看會(huì)有什么樣的“不好”的結(jié)果厢汹。

# 從數(shù)據(jù)集的分布就可以看出螟深,這個(gè)數(shù)據(jù)集不可能用直線分開
# 為了驗(yàn)證我們的判斷,下面還是使用SVM來構(gòu)建線性分類器將其分類

# 將整個(gè)數(shù)據(jù)集劃分為train set和test set
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y=train_test_split(
    dataset_X,dataset_y,test_size=0.25,random_state=42)

# print(train_X.shape)  # (225, 2)
# print(train_y.shape)  # (225,)
# print(test_X.shape)  # (75, 2)

# 使用線性核函數(shù)初始化一個(gè)SVM對(duì)象烫葬。
from sklearn.svm import SVC
classifier=SVC(kernel='linear') # 構(gòu)建線性分類器
classifier.fit(train_X,train_y)

-------------------------------------輸---------出--------------------------------

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='linear',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)

--------------------------------------------完-------------------------------------

然后查看一下這個(gè)訓(xùn)練好的SVM線性分類器在訓(xùn)練集和測(cè)試集上的表現(xiàn)界弧,如下為在訓(xùn)練集上的性能報(bào)告:

# 模型在訓(xùn)練集上的性能報(bào)告:
from sklearn.metrics import classification_report
plot_classifier(classifier,train_X,train_y)  # 分類器在訓(xùn)練集上的分類效果
target_names = ['Class-0', 'Class-1']
y_pred=classifier.predict(train_X)
print(classification_report(train_y, y_pred, target_names=target_names))
SVM線性分類器在訓(xùn)練集上的分類效果

-------------------------------------輸---------出--------------------------------

precision recall f1-score support

Class-0 0.60 0.96 0.74 114
Class-1 0.89 0.35 0.50 111

avg / total 0.74 0.66 0.62 225

--------------------------------------------完-------------------------------------

很明顯凡蜻,從分類效果圖和性能報(bào)告中,都可以看出這個(gè)模型很差垢箕,差到姥姥家了划栓。。条获。
所以忠荞,更不用說,在測(cè)試集上的表現(xiàn)了帅掘,當(dāng)然是一個(gè)差字了得委煤。。修档。

# 分類器在測(cè)試集上的分類效果
plot_classifier(classifier,test_X,test_y)  

target_names = ['Class-0', 'Class-1']
y_pred=classifier.predict(test_X)
print(classification_report(test_y, y_pred, target_names=target_names))
SVM線性分類器在測(cè)試集上的分類效果

-------------------------------------輸---------出--------------------------------

precision recall f1-score support

Class-0 0.57 1.00 0.73 36
Class-1 1.00 0.31 0.47 39

avg / total 0.79 0.64 0.59 75

--------------------------------------------完-------------------------------------


3. 用SVM構(gòu)建非線性分類器

很明顯碧绞,用線性分類器解決不了這個(gè)數(shù)據(jù)集的判別問題,所以我們就上馬非線性分類器吧吱窝。

使用SVM構(gòu)建非線性分類器主要是考慮使用不同的核函數(shù)讥邻,此處指講述兩種核函數(shù):多項(xiàng)式核函數(shù)和徑向基函數(shù)。

# 從上面的性能報(bào)告中可以看出癣诱,分類效果并不好
# 故而我們使用SVM建立非線性分類器计维,看看其分類效果
# 使用SVM建立非線性分類器主要是使用不同的核函數(shù)
# 第一種:使用多項(xiàng)式核函數(shù):
classifier_poly=SVC(kernel='poly',degree=3) # 三次多項(xiàng)式方程
classifier_poly.fit(train_X,train_y)

# 在訓(xùn)練集上的表現(xiàn)為:
plot_classifier(classifier_poly,train_X,train_y)  

target_names = ['Class-0', 'Class-1']
y_pred=classifier_poly.predict(train_X)
print(classification_report(train_y, y_pred, target_names=target_names))
SVM多項(xiàng)式核函數(shù)的非線性分類器的分類效果

-------------------------------------輸---------出--------------------------------

precision recall f1-score support

Class-0 0.92 0.85 0.89 114
Class-1 0.86 0.93 0.89 111

avg / total 0.89 0.89 0.89 225

--------------------------------------------完-------------------------------------

# 第二種:使用徑向基函數(shù)建立非線性分類器
classifier_rbf=SVC(kernel='rbf') 
classifier_rbf.fit(train_X,train_y)

# 在訓(xùn)練集上的表現(xiàn)為:
plot_classifier(classifier_rbf,train_X,train_y)  

target_names = ['Class-0', 'Class-1']
y_pred=classifier_rbf.predict(train_X)
print(classification_report(train_y, y_pred, target_names=target_names))
SVM徑向基函數(shù)的非線性分類器的分類效果

-------------------------------------輸---------出--------------------------------

precision recall f1-score support

Class-0 0.96 0.96 0.96 114
Class-1 0.96 0.95 0.96 111

avg / total 0.96 0.96 0.96 225

--------------------------------------------完-------------------------------------

########################小**********結(jié)###############################

1. 用SVM構(gòu)建非線性分類器很簡(jiǎn)單,只要使用不同的核函數(shù)就可以撕予。

2. 對(duì)于這個(gè)數(shù)據(jù)集而言鲫惶,使用了非線性分類器之后,分類效果得到了極大的改善实抡,這個(gè)可以從性能報(bào)告中看出欠母,而且,很明顯兩種非線性核函數(shù)吆寨,徑向基函數(shù)rbf的分類效果要比多項(xiàng)式核函數(shù)的效果更好一些赏淌。

3. 這個(gè)模型也許還可以繼續(xù)優(yōu)化一些超參數(shù),從而得到更好的分類效果啄清。

#################################################################


注:本部分代碼已經(jīng)全部上傳到(我的github)上六水,歡迎下載。

參考資料:

1, Python機(jī)器學(xué)習(xí)經(jīng)典實(shí)例辣卒,Prateek Joshi著掷贾,陶俊杰,陳小莉譯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荣茫,一起剝皮案震驚了整個(gè)濱河市想帅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啡莉,老刑警劉巖港准,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旨剥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浅缸,警方通過查閱死者的電腦和手機(jī)轨帜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衩椒,“玉大人阵谚,你說我怎么就攤上這事⊙叹撸” “怎么了梢什?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)朝聋。 經(jīng)常有香客問我嗡午,道長(zhǎng),這世上最難降的妖魔是什么冀痕? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任荔睹,我火速辦了婚禮,結(jié)果婚禮上言蛇,老公的妹妹穿的比我還像新娘僻他。我一直安慰自己,他們只是感情好腊尚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布吨拗。 她就那樣靜靜地躺著,像睡著了一般婿斥。 火紅的嫁衣襯著肌膚如雪劝篷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天民宿,我揣著相機(jī)與錄音娇妓,去河邊找鬼。 笑死活鹰,一個(gè)胖子當(dāng)著我的面吹牛哈恰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播志群,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼着绷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了赖舟?” 一聲冷哼從身側(cè)響起蓬戚,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤夸楣,失蹤者是張志新(化名)和其女友劉穎宾抓,沒想到半個(gè)月后子漩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡石洗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年幢泼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讲衫。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缕棵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涉兽,到底是詐尸還是另有隱情招驴,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布枷畏,位于F島的核電站别厘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拥诡。R本人自食惡果不足惜触趴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渴肉。 院中可真熱鬧冗懦,春花似錦、人聲如沸仇祭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乌奇。三九已至嚣艇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間华弓,已是汗流浹背食零。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寂屏,地道東北人贰谣。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像迁霎,于是被迫代替她去往敵國(guó)和親吱抚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容