分類算法-線性分類器 LogisticRegression and SGDClassifier

前言

此程序基于良/惡性腫瘤預(yù)測實(shí)驗(yàn)。

分別用LogisticRegression模型和SGDClassifier模型實(shí)現(xiàn)預(yù)測任務(wù)心铃。

本程序可以流暢運(yùn)行于Python3.6環(huán)境,但是Python2.x版本需要修正的地方也已經(jīng)在注釋中說明颅筋。

requirements:pandas,numpy,scikit-learn

想查看其他經(jīng)典算法實(shí)現(xiàn)可以關(guān)注查看本人其他文集田轧。

實(shí)驗(yàn)結(jié)果分析

LogisticRegression比起SGDClassifier在測試機(jī)上表現(xiàn)有更高的準(zhǔn)確性,這是因?yàn)镾cikit-learn中采用解析的方式精確計(jì)算LogisticRegression的參數(shù)蔚携,而使用梯度法估計(jì)SGDClassifier的參數(shù)。

相比之下克饶,前者計(jì)算時間長但是模型性能略高酝蜒;后者采用隨機(jī)梯度上升算法估計(jì)模型參數(shù),計(jì)算時間短矾湃,但是產(chǎn)出的模型性能略低亡脑。一般而言,對于訓(xùn)練數(shù)據(jù)規(guī)模在10萬量級以上的數(shù)據(jù)邀跃,考慮到時間的耗用霉咨,更適合使用隨機(jī)梯度算法對模型進(jìn)行估計(jì)。

程序源碼

import pandas as pd

import numpy as np

# features column names

column_names = ['Sample code number','Clump Thickness','Uniformity of Cell Size' ,'Uniformity of Cell Shape','Marginal Adhesion',

'Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']

#read data from csv file

data = pd.read_csv('./breast-cancer-wisconsin.data',names=column_names)

#Data preprocessing

#replace all ? with standard missing value

data = data.replace(to_replace='?',value=np.nan)

#drop all data rows which have any missing feature

data=data.dropna(how='any')

# data.to_csv('./text.csv')# save data to csv file

#notes:you should use cross_valiation instead of model_valiation in python 2.7

#from sklearn.cross_validation import train_test_split #DeprecationWarning

from sklearn.model_selection import train_test_split #use train_test_split module of sklearn.model_valiation to split data

#take 25 percent of data randomly for testing,and others for training

X_train,X_test,y_train,y_test = train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=33)

#check the numbers and category distribution of the test samples

# print(y_train.value_counts())

# print(y_test.value_counts())

#import relative package

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression

from sklearn.linear_model import SGDClassifier

#standardizing data in train set and test set

ss = StandardScaler()

X_train = ss.fit_transform(X_train)

X_test = ss.transform(X_test)

#initializing logisticregression and sgdcclassifier model

lr=LogisticRegression()

#notes:the default parameters in python2.7 are max_iter=5 tol=none,you can don't specify the parameters of sgdclassifier

#sgdc=SGDClassifier() #DeprecationWarning

sgdc=SGDClassifier(max_iter=5,tol=None)

#call fit function to trainning arguments ofmodel

lr.fit(X_train,y_train)

#save the prediction of test set in variable

lr_y_predict=lr.predict(X_test)

sgdc.fit(X_train,y_train)

sgdc_y_predict=sgdc.predict(X_test)

#performance analysis

from sklearn.metrics import classification_report

#get accuracy by the score function in LR model

print('Accuracy of LR Classifier:',lr.score(X_test,y_test))

#get? precision ,recall and f1-score from classification_report module

print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))

#get accuracy by the score function in SGD classifier

print('Accuracy of SGD Classifier:',sgdc.score(X_test,y_test))

#get? precision ,recall and f1-score from classification_report module

print(classification_report(y_test,sgdc_y_predict,target_names=['Benign','Malignant']))

Ubuntu16.04 Python3.6 程序輸出結(jié)果:

Accuracy of LR Classifier: 0.9883040935672515

? ? ? ? ? ? precision? ? recall? f1-score? support

? ? Benign? ? ? 0.99? ? ? 0.99? ? ? 0.99? ? ? 100

? Malignant? ? ? 0.99? ? ? 0.99? ? ? 0.99? ? ? ? 71

avg / total? ? ? 0.99? ? ? 0.99? ? ? 0.99? ? ? 171

Accuracy of SGD Classifier: 0.9824561403508771

? ? ? ? ? ? precision? ? recall? f1-score? support

? ? Benign? ? ? 1.00? ? ? 0.97? ? ? 0.98? ? ? 100

? Malignant? ? ? 0.96? ? ? 1.00? ? ? 0.98? ? ? ? 71

avg / total? ? ? 0.98? ? ? 0.98? ? ? 0.98? ? ? 171

數(shù)據(jù)下載地址

歡迎指正錯誤拍屑,包括英語和程序錯誤途戒。有問題也歡迎提問,一起加油一起進(jìn)步僵驰。

本程序完全是本人逐字符輸入的勞動結(jié)果棺滞,轉(zhuǎn)載請注明出處裁蚁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市继准,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矮男,老刑警劉巖移必,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毡鉴,居然都是意外死亡崔泵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門猪瞬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憎瘸,“玉大人,你說我怎么就攤上這事陈瘦』细剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵痊项,是天一觀的道長锅风。 經(jīng)常有香客問我,道長鞍泉,這世上最難降的妖魔是什么皱埠? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮咖驮,結(jié)果婚禮上边器,老公的妹妹穿的比我還像新娘。我一直安慰自己托修,他們只是感情好忘巧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诀黍,像睡著了一般袋坑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眯勾,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天枣宫,我揣著相機(jī)與錄音,去河邊找鬼吃环。 笑死也颤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郁轻。 我是一名探鬼主播翅娶,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼文留,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竭沫?” 一聲冷哼從身側(cè)響起燥翅,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜕提,沒想到半個月后森书,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谎势,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年凛膏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脏榆。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡猖毫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出须喂,到底是詐尸還是另有隱情吁断,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布镊折,位于F島的核電站胯府,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏恨胚。R本人自食惡果不足惜骂因,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赃泡。 院中可真熱鬧寒波,春花似錦、人聲如沸升熊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽级野。三九已至页屠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蓖柔,已是汗流浹背辰企。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留况鸣,地道東北人牢贸。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像镐捧,于是被迫代替她去往敵國和親潜索。 傳聞我的和親對象是個殘疾皇子臭增,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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