Python機(jī)器學(xué)習(xí)基礎(chǔ)教程學(xué)習(xí)筆記(6)——線性模型(分類)

Python機(jī)器學(xué)習(xí)基礎(chǔ)教程學(xué)習(xí)筆記(6)——線性模型(分類)

1. 二分類

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
# 不想看到warnings
import warnings
warnings.filterwarnings("ignore", category=Warning)
# 拆分訓(xùn)練集與測試集
from sklearn.model_selection import train_test_split
# 使用兩個分類算法:LogisticRegression和LinearSVC
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC

X, y = mglearn.datasets.make_forge()

fig, axes = plt.subplots(1, 2, figsize=(10, 3))

for model, ax in zip([LinearSVC(), LogisticRegression()], axes):
    clf = model.fit(X, y)
    mglearn.plots.plot_2d_separator(clf, X, fill=False, eps=0.5,
                                    ax=ax, alpha=.7)
    mglearn.discrete_scatter(X[:, 0], X[:, 1], y, ax=ax)
    ax.set_title(clf.__class__.__name__)
    ax.set_xlabel("Feature 0")
    ax.set_ylabel("Feature 1")
    ax.legend()

output_3_0.png
  • LinearSVC和LogisticRegression兩個模型默認(rèn)都使用L2正則化
  • 決定正則化強(qiáng)度的權(quán)衡參數(shù)叫做C。
  • C值越大粘昨,對應(yīng)的正則化越弱。
  • C值較大微峰,模型將盡可能將訓(xùn)練集擬合到最好
  • C值較小,模型更強(qiáng)調(diào)使用系統(tǒng)向量接近于0
mglearn.plots.plot_linear_svc_regularization()
output_5_0.png
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=42)
logreg = LogisticRegression().fit(X_train, y_train)
print("Training set score: {:.3f}".format(logreg.score(X_train, y_train)))
print("Test set score: {:.3f}".format(logreg.score(X_test, y_test)))
Training set score: 0.953
Test set score: 0.958
  • C=1的默認(rèn)值給出了相當(dāng)好的性能蕴忆,都是95%的精度屯远。
  • 訓(xùn)練集和測試集的性能非常接近,所以很可能是欠擬合惕耕。
  • 嘗試增大C來擬合一個更靈活的模型
logreg100 = LogisticRegression(C=100).fit(X_train, y_train)
print("Training set score: {:.3f}".format(logreg100.score(X_train, y_train)))
print("Test set score: {:.3f}".format(logreg100.score(X_test, y_test)))
Training set score: 0.972
Test set score: 0.965
  • 當(dāng)減小C值時,正則化更強(qiáng)诫肠,訓(xùn)練集和測試集精度都變小
logreg001 = LogisticRegression(C=0.01).fit(X_train, y_train)
print("Training set score: {:.3f}".format(logreg001.score(X_train, y_train)))
print("Test set score: {:.3f}".format(logreg001.score(X_test, y_test)))
Training set score: 0.934
Test set score: 0.930
plt.plot(logreg.coef_.T,'o',label="C=1")
plt.plot(logreg100.coef_.T,'^',label="C=100")

plt.plot(logreg001.coef_.T,'v',label="C=0.01")

# 給橫坐標(biāo)賦值
plt.xticks(range(cancer.data.shape[1]),cancer.feature_names,rotation=90)

# 加中間的橫線
plt.hlines(0,0,cancer.data.shape[1])
plt.ylim(-5,5)
plt.xlabel("coefficient index")
plt.ylabel("coeffient magnitude")
plt.legend()
plt.show()
output_11_0.png
  • LogisticRegression使用的是L2正則化
  • 更強(qiáng)的正則化使用得系統(tǒng)趨向于0司澎,但是系統(tǒng)永遠(yuǎn)不會正好等于0
  • 對線性模型系統(tǒng)的解釋應(yīng)該始終持保留態(tài)度
  • 如果想要解釋性更強(qiáng)的模型,使用L1正則化可能更好栋豫,因?yàn)樗s束模型只使用少數(shù)的幾個特征
for C,marker in zip([0.001,1,100],['o','^','v']):
    # 這里把penalty參數(shù)設(shè)置為l1挤安,表示使用L1正則化
    lr_l1= LogisticRegression(C=C,penalty="l1").fit(X_train,y_train)
    print("C={:.3f}".format(C))
    print("Training set score : {:.3f}".format(lr_l1.score(X_train, y_train)))
    print("Test set score : {:.3f}".format(lr_l1.score(X_test, y_test)))
    print("---------------------------------------")
    plt.plot(lr_l1.coef_.T,marker,label="C={:.3f}".format(C))
# 給橫坐標(biāo)賦值
plt.xticks(range(cancer.data.shape[1]),cancer.feature_names,rotation=90)

# 加中間的橫線
plt.hlines(0,0,cancer.data.shape[1])
plt.ylim(-5,5)
plt.xlabel("coefficient index")
plt.ylabel("coeffient magnitude")
plt.legend()
plt.show()
C=0.001
Training set score : 0.913
Test set score : 0.923
---------------------------------------
C=1.000
Training set score : 0.960
Test set score : 0.958
---------------------------------------
C=100.000
Training set score : 0.986
Test set score : 0.979
---------------------------------------
output_13_1.png
  • 模型的主要差別在于penalty參數(shù),這個參數(shù)會影響正則化丧鸯,也會影響模型是使用所有可用特征還是只選擇特征的一個子集

2. 多分類

將二分類算法推廣到多分類算法的一種常見方法是“一對其余”(one-vs.-rest)

from sklearn.datasets import make_blobs
X ,y = make_blobs(random_state=42)
mglearn.discrete_scatter(X[:,0],X[:,1],y)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.legend(["Class 0","Class 1","Class 2"])
plt.show()
output_17_0.png
linear_svm = LinearSVC().fit(X,y)
# coef_的形狀是(3,2),說明coef_每行包含三個類別之一的系統(tǒng)微量每列包含某個特征(這個數(shù)據(jù)集有2個特征)對應(yīng)的系數(shù)值蛤铜。
print("Coefficient shape:{}".format(linear_svm.coef_.shape))
# intercept_的形狀是(3,),是一維數(shù)組丛肢,保存每個類別的截距
print("Intercept shape:{}".format(linear_svm.intercept_.shape))
Coefficient shape:(3, 2)
Intercept shape:(3,)
mglearn.discrete_scatter(X[:,0],X[:,1],y)
line = np.linspace(-15,15)
# -(line*coef[0]+ intercept)/coef[1] 這個值可以簡單理解一下
for coef,intercept,color in zip(linear_svm.coef_,linear_svm.intercept_,['b','r','g']):
    plt.plot(line,-(line*coef[0]+ intercept)/coef[1],color)
plt.xlim(-10,8)
plt.ylim(-10,15)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.legend(["Class 0","Class 1","Class 2","Line class 0","Line class 1","Line class 2"],loc=(1.01,0.3))
plt.show()
output_19_0.png
  • 從圖中可以看出這種“一對其余”(one-vs.-rest)的樣子
  • 但是圖中間的三角形區(qū)域?qū)儆谀囊粋€類別呢围肥,3個二類分類器都將這一區(qū)域內(nèi)的點(diǎn)劃分為“其余”
  • 答案是,分類方程結(jié)果最大的那個類別蜂怎,即最接近的那條線對應(yīng)的類別穆刻。
mglearn.plots.plot_2d_classification(linear_svm,X,fill=True,alpha=.3)
mglearn.discrete_scatter(X[:,0],X[:,1],y)
line = np.linspace(-15,15)
# -(line*coef[0]+ intercept)/coef[1] 這個值可以簡單理解一下
for coef,intercept,color in zip(linear_svm.coef_,linear_svm.intercept_,['b','r','g']):
    plt.plot(line,-(line*coef[0]+ intercept)/coef[1],color)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.legend(["Class 0","Class 1","Class 2","Line class 0","Line class 1","Line class 2"],loc=(1.01,0.3))
plt.show()
output_21_0.png

3 優(yōu)點(diǎn)、缺點(diǎn)和參數(shù)

  • 線性模型的主要參數(shù)是正則化參數(shù)
    • 回歸模型中叫alpha
    • 分類模型中叫C
    • alpha值較大或C值較小杠步,說明模型比較簡單
  • 還需要確定使用L1正則化還是L2正則化
    • 如果假定只有幾個特征是真正重要的氢伟,那么使用L1正則化,否則默認(rèn)使用L2正則化
    • 如果模型的可解釋性很重要幽歼,使用L1會有幫助
  • 線性模型的訓(xùn)練速度非扯渎啵快,預(yù)測速度也很快试躏。
  • 可推廣到非常大的數(shù)據(jù)集
  • 稀疏數(shù)據(jù)也很有效
    • 如果數(shù)據(jù)包含數(shù)十萬甚至上百萬個樣本猪勇,需要研究如何使用LogisticRegression和Ridge模型的solver='sag'選項(xiàng)设褐,在處理大數(shù)據(jù)時颠蕴,這一選項(xiàng)比默認(rèn)值更快
    • 其他選項(xiàng)還有SGDClassifier類和SDGRegressor類泣刹,對本節(jié)介紹的線性模型實(shí)現(xiàn)了可擴(kuò)展性更強(qiáng)的版本。
  • 如果特征數(shù)量大于樣本數(shù)量犀被,線性模型表現(xiàn)通常都很好椅您。
  • 常用于非常大的數(shù)據(jù)集,只是因?yàn)橛?xùn)練其他模型并不可行寡键。
  • 在更低維的空間中掀泳,其他模型的泛化性能可能更好
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市西轩,隨后出現(xiàn)的幾起案子员舵,更是在濱河造成了極大的恐慌,老刑警劉巖藕畔,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件马僻,死亡現(xiàn)場離奇詭異,居然都是意外死亡注服,警方通過查閱死者的電腦和手機(jī)韭邓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溶弟,“玉大人女淑,你說我怎么就攤上這事」加” “怎么了鸭你?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長擒权。 經(jīng)常有香客問我苇本,道長,這世上最難降的妖魔是什么菜拓? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任瓣窄,我火速辦了婚禮,結(jié)果婚禮上纳鼎,老公的妹妹穿的比我還像新娘俺夕。我一直安慰自己,他們只是感情好贱鄙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布劝贸。 她就那樣靜靜地躺著,像睡著了一般逗宁。 火紅的嫁衣襯著肌膚如雪映九。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天瞎颗,我揣著相機(jī)與錄音件甥,去河邊找鬼捌议。 笑死,一個胖子當(dāng)著我的面吹牛引有,可吹牛的內(nèi)容都是我干的瓣颅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼譬正,長吁一口氣:“原來是場噩夢啊……” “哼宫补!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曾我,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粉怕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抒巢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斋荞,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年虐秦,在試婚紗的時候發(fā)現(xiàn)自己被綠了平酿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡悦陋,死狀恐怖蜈彼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俺驶,我是刑警寧澤幸逆,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站暮现,受9級特大地震影響还绘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栖袋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一拍顷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塘幅,春花似錦昔案、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匾乓,卻和暖如春捞稿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工娱局, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彰亥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓铃辖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猪叙。 傳聞我的和親對象是個殘疾皇子娇斩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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