EduCoder 机器学习 逻辑回归
邏輯回歸是屬于機(jī)器學(xué)習(xí)里面的監(jiān)督學(xué)習(xí),它是以回歸的思想來解決分類問題的一種非常經(jīng)典的二分類分類器。由于其訓(xùn)練后的參數(shù)有較強(qiáng)的可解釋性,在諸多領(lǐng)域中,邏輯回歸通常用作 baseline 模型,以方便后期更好的挖掘業(yè)務(wù)相關(guān)信息或提升模型性能。
本實(shí)訓(xùn)項(xiàng)目的主要內(nèi)容是基于 Python 語言搭建出一個(gè)能夠識別惡性腫瘤的邏輯回歸模型,并使用 sklearn 中的 LogisticRegression 實(shí)現(xiàn)手寫數(shù)字識別。
第1關(guān):邏輯回歸核心思想
- 任務(wù)描述
- 相關(guān)知識
- 什么是邏輯回歸
- sigmoid 函數(shù)
- 編程要求
- 測試說明
任務(wù)描述
本關(guān)任務(wù):根據(jù)本節(jié)課所學(xué)知識完成本關(guān)所設(shè)置的編程題。
相關(guān)知識
為了完成本關(guān)任務(wù),你需要掌握:
什么是邏輯回歸;
sigmoid函數(shù)。
什么是邏輯回歸
當(dāng)一看到“回歸”這兩個(gè)字,可能會認(rèn)為邏輯回歸是一種解決回歸問題的算法,然而邏輯回歸是通過回歸的思想來解決二分類問題的算法。
那么問題來了,回歸的算法怎樣解決分類問題呢?其實(shí)很簡單,邏輯回歸是將樣本特征和樣本所屬類別的概率聯(lián)系在一起,假設(shè)現(xiàn)在已經(jīng)訓(xùn)練好了一個(gè)邏輯回歸的模型為 f(x) ,模型的輸出是樣本 x 的標(biāo)簽是 1 的概率,則該模型可以表示, p^?=f(x) 。若得到了樣本 x 屬于標(biāo)簽 1 的概率后,很自然的就能想到當(dāng) p^?>0.5 時(shí) x 屬于標(biāo)簽 1 ,否則屬于標(biāo)簽 0 。所以就有
y^?={01?p^?<0.5p^?>0.5?
(其中 y^? 為樣本 x 根據(jù)模型預(yù)測出的標(biāo)簽結(jié)果,標(biāo)簽 0 和標(biāo)簽 1 所代表的含義是根據(jù)業(yè)務(wù)決定的,比如在癌細(xì)胞識別中可以使 0 代表良性腫瘤, 1 代表惡性腫瘤)。
由于概率是 0 到 1 的實(shí)數(shù),所以邏輯回歸若只需要計(jì)算出樣本所屬標(biāo)簽的概率就是一種回歸算法,若需要計(jì)算出樣本所屬標(biāo)簽,則就是一種二分類算法。
那么邏輯回歸中樣本所屬標(biāo)簽的概率怎樣計(jì)算呢?其實(shí)和線性回歸有關(guān)系,學(xué)習(xí)了線性回歸的同學(xué)肯定知道線性回歸無非就是訓(xùn)練出一組參數(shù) WT 和 b 來擬合樣本數(shù)據(jù),線性回歸的輸出為 y^?=WTx+b 。不過 y^? 的值域是 (?∞,+∞) ,如果能夠?qū)⒅涤驗(yàn)?(?∞,+∞) 的實(shí)數(shù)轉(zhuǎn)換成 (0,1) 的概率值的話問題就解決了。要解決這個(gè)問題很自然地就能想到將線性回歸的輸出作為輸入,輸入到另一個(gè)函數(shù)中,這個(gè)函數(shù)能夠進(jìn)行轉(zhuǎn)換工作,假設(shè)函數(shù)為 σ ,轉(zhuǎn)換后的概率為 p^? ,則邏輯回歸在預(yù)測時(shí)可以看成p^?=σ(WTx+b) 。 σ 其實(shí)就是接下來要介紹的sigmoid函數(shù)。
sigmoid 函數(shù)
sigmoid函數(shù)的公式為:
σ(t)=1/(1+e?t)
函數(shù)圖像如下圖所示:
從sigmoid函數(shù)的圖像可以看出當(dāng) t 趨近于 ?∞ 時(shí)函數(shù)值趨近于 0 ,當(dāng) t 趨近于 +∞ 時(shí)函數(shù)值趨近于 1 。可見sigmoid函數(shù)的值域是 (0,1) ,滿足我們要將 (?∞,+∞) 的實(shí)數(shù)轉(zhuǎn)換成 (0,1) 的概率值的需求。因此邏輯回歸在預(yù)測時(shí)可以看成
p^?=1/(1+e?WTx+b)
編程要求
根據(jù)提示,在右側(cè)編輯器補(bǔ)充 Python 代碼,實(shí)現(xiàn)sigmoid函數(shù)。底層代碼會調(diào)用您實(shí)現(xiàn)的sigmoid函數(shù)來進(jìn)行測試。(提示: numpy.exp()函數(shù)可以實(shí)現(xiàn) e 的冪運(yùn)算)
測試說明
測試用例:
輸入:1
預(yù)期輸出:0.73105857863
輸入:-2
預(yù)期輸出:0.119202922022
開始你的任務(wù)吧,祝你成功!
#encoding=utf8 import numpy as npdef sigmoid(t):'''完成sigmoid函數(shù)計(jì)算:param t: 負(fù)無窮到正無窮的實(shí)數(shù):return: 轉(zhuǎn)換后的概率值:可以考慮使用np.exp()函數(shù)'''#********** Begin **********#return 1/(1+np.exp(-1*t))#********** End **********#第2關(guān):邏輯回歸的損失函數(shù)
- 任務(wù)描述
- 相關(guān)知識
- 為什么需要損失函數(shù)
- 邏輯回歸的損失函數(shù)
- 編程要求
- 測試說明
任務(wù)描述
本關(guān)任務(wù):根據(jù)本節(jié)課所學(xué)知識完成本關(guān)所設(shè)置的選擇題。
相關(guān)知識
為什么需要損失函數(shù)
訓(xùn)練邏輯回歸模型的過程其實(shí)與之前學(xué)習(xí)的線性回歸一樣,就是去尋找合適的 WT 和 b 使得模型的預(yù)測結(jié)果與真實(shí)結(jié)果盡可能一致。所以就需要一個(gè)函數(shù)能夠衡量模型擬合程度的好壞,也就是說當(dāng)模型擬合誤差越大的時(shí)候,函數(shù)值應(yīng)該比較大,反之應(yīng)該比較小,這就是損失函數(shù)。
邏輯回歸的損失函數(shù)
根據(jù)上一關(guān)中所學(xué)習(xí)到的知識,我們已經(jīng)知道了邏輯回歸計(jì)算出的樣本所屬類別的概率 p^?=σ(WTx+b) ,樣本所屬列表的判定條件為
y^?={01?p^?<0.5p^?>0.5?
很明顯,在預(yù)測樣本屬于哪個(gè)類別時(shí)取決于算出來的p^?。從另外一個(gè)角度來說,假設(shè)現(xiàn)在有一個(gè)樣本的真實(shí)類別為 1 ,模型預(yù)測樣本為類別 1 的概率為 0.9 的話,就意味著這個(gè)模型認(rèn)為當(dāng)前樣本的類別有 90% 的可能性為 1 ,有 10% 的可能性為0。所以從這個(gè)角度來看,邏輯回歸的損失函數(shù)與 p^? 有關(guān)。
當(dāng)然邏輯回歸的損失函數(shù)不僅僅與 p^? 有關(guān),它還與真實(shí)類別有關(guān)。假設(shè)現(xiàn)在有兩種情況,情況A:現(xiàn)在有個(gè)樣本的真實(shí)類別是 0 ,但是模型預(yù)測出來該樣本是類別 1 的概率是 0.7 (也就是說類別 0 的概率為 0.3 );情況B:現(xiàn)在有個(gè)樣本的真實(shí)類別是 0 ,但是模型預(yù)測出來該樣本是類別 1 的概率是 0.6 (也就是說類別 0 的概率為 0.4 );請你思考 2 秒鐘,AB兩種情況哪種情況的誤差更大?很顯然,情況A的誤差更大!因?yàn)榍闆rA中模型認(rèn)為樣本是類別 0 的可能性只有 30% ,而B有 40% 。
假設(shè)現(xiàn)在又有兩種情況,情況A:現(xiàn)在有個(gè)樣本的真實(shí)類別是 0 ,但是模型預(yù)測出來該樣本是類別 1 的概率是 0.7 (也就是說類別 0 的概率為 0.3 );情況B:現(xiàn)在有個(gè)樣本的真實(shí)類別是 1 ,但是模型預(yù)測出來該樣本是類別 1 的概率是 0.3 (也就是說類別 0 的概率為 0.7 );請你再思考 2 秒鐘,AB兩種情況哪種情況的誤差更大?很顯然,一樣大!
所以邏輯回歸的損失函數(shù)如下,其中 cost 表示損失函數(shù)的值, y 表示樣本的真實(shí)類別:
cost=?ylog(p^?)?(1?y)log(1?p^?)
這個(gè)式子其實(shí)很好理解,當(dāng)樣本的真實(shí)類別為 1 時(shí),式子就變成了 cost=?log(p^?)。此時(shí)函數(shù)圖像如下:
從圖像能看出當(dāng)樣本的真實(shí)類別為1的前提下,p^? 越大,損失函數(shù)值就越小。因?yàn)?p^? 越大就越說明模型越認(rèn)為該樣本的類別為 1 。
當(dāng)樣本的真實(shí)類別為 0 時(shí),式子就變成了 cost=?log(1?p^?) 。此時(shí)函數(shù)圖像如下:
從圖像能看出當(dāng)樣本的真實(shí)類別為 0 的前提下,hatp 越大,損失函數(shù)值就越大。因?yàn)?p^? 越大就越說明模型越認(rèn)為該樣本的類別為 1 。
cost=?ylog(p^?)?(1?y)log(1?p^?) 是一個(gè)樣本的損失計(jì)算公式,但是在一般情況下需要計(jì)算的是 m 條樣本數(shù)據(jù)的平均損失值,所以損失函數(shù)的最終形態(tài)如下,其中 m 表示數(shù)據(jù)集中樣本的數(shù)量, i 表示數(shù)據(jù)集中第 i 個(gè)樣本:
cost=?m1?sumi=0m?y(i)log(p^?(i))?(1?y(i))log(1?p^?(i))
知道了邏輯回歸的損失函數(shù)之后,邏輯回歸的訓(xùn)練流程就很明顯了,就是尋找一組合適的 WT 和 b ,使得損失值最小。找到這組參數(shù)后模型就確定下來了。
編程要求
根據(jù)相關(guān)知識,按照要求完成右側(cè)選擇題任務(wù),包含單選題和多選題。
測試說明
平臺會對你選擇的答案進(jìn)行判斷,全對則通過測試。
開始你的任務(wù)吧,祝你成功!
1、邏輯回歸的損失函數(shù)可以寫成如下形式(A)
cost={?log(p^?)?log(1?p^?)?y=1y=0?
A、對
B、錯(cuò)
2、下列說法正確的是(ACD)
A、損失值能夠衡量模型在訓(xùn)練數(shù)據(jù)集上的擬合程度
B、sigmoid函數(shù)不可導(dǎo)
C、sigmoid函數(shù)的輸入越大,輸出就越大
D、訓(xùn)練的過程,就是尋找合適的參數(shù)使得損失函數(shù)值最小的過程
3、sigmoid函數(shù)(對數(shù)幾率函數(shù))相對于單位階躍函數(shù)有哪些好處?(AB)
A、sigmoid函數(shù)可微分
B、sigmoid函數(shù)處處連續(xù)
C、sigmoid函數(shù)不是單調(diào)的
D、sigmoid函數(shù)最多計(jì)算二階導(dǎo)
4、邏輯回歸的優(yōu)點(diǎn)有哪些?(D)
A、需要事先對數(shù)據(jù)的分布做假設(shè)
B、可以得到“類別”的真正的概率預(yù)測
C、可以用閉式解求解
D、可以用現(xiàn)有的數(shù)值優(yōu)化算法求解
第3關(guān):梯度下降
- 任務(wù)描述
- 相關(guān)知識
- 什么是梯度
- 梯度下降算法原理
- 編程要求
- 測試說明
任務(wù)描述
本關(guān)任務(wù):用 Python 構(gòu)建梯度下降算法,并求取目標(biāo)函數(shù)最小值。
相關(guān)知識
為了完成本關(guān)任務(wù),你需要掌握:梯度下降算法。
什么是梯度
梯度:梯度的本意是一個(gè)向量,由函數(shù)對每個(gè)參數(shù)的偏導(dǎo)組成,表示某一函數(shù)在該點(diǎn)處的方向?qū)?shù)沿著該方向取得最大值,即函數(shù)在該點(diǎn)處沿著該方向變化最快,變化率最大。
梯度下降算法原理
算法思想:梯度下降是一種非常通用的優(yōu)化算法,能夠?yàn)榇蠓秶膯栴}找到最優(yōu)解。梯度下降的中心思想就是迭代地調(diào)整參數(shù)從而使損失函數(shù)最小化。假設(shè)你迷失在山上的迷霧中,你能感覺到的只有你腳下路面的坡度。快速到達(dá)山腳的一個(gè)策略就是沿著最陡的方向下坡。這就是梯度下降的做法:通過測量參數(shù)向量 θ 相關(guān)的損失函數(shù)的局部梯度,并不斷沿著降低梯度的方向調(diào)整,直到梯度降為 0 ,達(dá)到最小值。
梯度下降公式如下:
對應(yīng)到每個(gè)權(quán)重公式為:
其中 η 為學(xué)習(xí)率,是 0 到 1 之間的值,是個(gè)超參數(shù),需要我們自己來確定大小。
算法原理: 在傳統(tǒng)機(jī)器學(xué)習(xí)中,損失函數(shù)通常為凸函數(shù),假設(shè)此時(shí)只有一個(gè)參數(shù),則損失函數(shù)對參數(shù)的梯度即損失函數(shù)對參數(shù)的導(dǎo)數(shù)。如果剛開始參數(shù)初始在最優(yōu)解的左邊,
很明顯,這個(gè)時(shí)候損失函數(shù)對參數(shù)的導(dǎo)數(shù)是小于 0 的,而學(xué)習(xí)率是一個(gè) 0 到 1 之間的數(shù),此時(shí)按照公式更新參數(shù),初始的參數(shù)減去一個(gè)小于 0 的數(shù)是變大,也就是在坐標(biāo)軸上往右走,即朝著最優(yōu)解的方向走。同樣的,如果參數(shù)初始在最優(yōu)解的右邊,
此時(shí)按照公式更新,參數(shù)將會朝左走,即最優(yōu)解的方向。所以,不管剛開始參數(shù)初始在何位置,按著梯度下降公式不斷更新,參數(shù)都會朝著最優(yōu)解的方向走。 #####梯度下降算法流程
編程要求
根據(jù)提示,使用 Python 實(shí)現(xiàn)梯度下降算法,并損失函數(shù)最小值時(shí)對應(yīng)的參數(shù)theta,theta會返回給外部代碼,由外部代碼來判斷theta是否正確。
測試說明
損失函數(shù)為:loss=2?(θ?3) 最優(yōu)參數(shù)為:3.0 你的答案跟最優(yōu)參數(shù)的誤差低于0.0001才能通關(guān)。
開始你的任務(wù)吧,祝你成功!
# -*- coding: utf-8 -*-import numpy as np import warnings warnings.filterwarnings("ignore")def gradient_descent(initial_theta,eta=0.05,n_iters=1000,epslion=1e-8):'''梯度下降:param initial_theta: 參數(shù)初始值,類型為float:param eta: 學(xué)習(xí)率,類型為float:param n_iters: 訓(xùn)練輪數(shù),類型為int:param epslion: 容忍誤差范圍,類型為float:return: 訓(xùn)練后得到的參數(shù)'''# 請?jiān)诖颂砑訉?shí)現(xiàn)代碼 ##********** Begin *********#theta = initial_thetai_iter = 0while i_iter < n_iters:gradient = 2*(theta-3)last_theta = thetatheta = theta - eta*gradientif(abs(theta-last_theta)<epslion):breaki_iter +=1return theta#********** End **********#第4關(guān):動手實(shí)現(xiàn)邏輯回歸 - 癌細(xì)胞精準(zhǔn)識別
- 任務(wù)描述
- 相關(guān)知識
- 數(shù)據(jù)集介紹
- 構(gòu)建邏輯回歸模型
- 訓(xùn)練邏輯回歸模型
- 編程要求
- 測試說明
任務(wù)描述
本關(guān)任務(wù):使用邏輯回歸算法建立一個(gè)模型,并通過梯度下降算法進(jìn)行訓(xùn)練,得到一個(gè)能夠準(zhǔn)確對癌細(xì)胞進(jìn)行識別的模型。
相關(guān)知識
為了完成本關(guān)任務(wù),你需要掌握:
- 邏輯回歸算法流程;
- 邏輯回歸中的梯度下降。
數(shù)據(jù)集介紹
乳腺癌數(shù)據(jù)集,其實(shí)例數(shù)量是 569 ,實(shí)例中包括診斷類和屬性,幫助預(yù)測的屬性一共 30 個(gè),各屬性包括為 radius 半徑(從中心到邊緣上點(diǎn)的距離的平均值), texture 紋理(灰度值的標(biāo)準(zhǔn)偏差)等等,類包括: WDBC-Malignant 惡性和 WDBC-Benign 良性。用數(shù)據(jù)集的 80% 作為訓(xùn)練集,數(shù)據(jù)集的 20% 作為測試集,訓(xùn)練集和測試集中都包括特征和類別。其中特征和類別均為數(shù)值類型,類別中 0 代表良性, 1 代表惡性。
構(gòu)建邏輯回歸模型
由數(shù)據(jù)集可以知道,每一個(gè)樣本有 30 個(gè)特征和 1 個(gè)標(biāo)簽,而我們要做的事就是通過這 30 個(gè)特征來分析細(xì)胞是良性還是惡性(其中標(biāo)簽 y=0 表示是良性, y=1 表示是惡性)。邏輯回歸算法正好是一個(gè)二分類模型,我們可以構(gòu)建一個(gè)邏輯回歸模型,來對癌細(xì)胞進(jìn)行識別。模型如下:
z=b+w1?x1?+w2?x2?+...+wn?xn?
y=1+e?z1?
其中 xi?表示第 i 個(gè)特征,wi?表示第 i 個(gè)特征對應(yīng)的權(quán)重,b表示偏置。 為了方便,我們稍微將模型進(jìn)行變換:
z=w0?x0?+w1?x1?+w2?x2?+...+wn?xn?
其中x0?等于 1 。
Z=heta.X
heta=(w0?,w1?,...,wn?)
X=(1,x1?,...,xn?)
y=1+e?θ.X1?
我們將一個(gè)樣本輸入模型,如果預(yù)測值大于等于 0.5 則判定為 1 類別,如果小于 0.5 則判定為 0 類別。
訓(xùn)練邏輯回歸模型
我們已經(jīng)知道如何構(gòu)建一個(gè)邏輯回歸模型,但是如何得到一個(gè)能正確對癌細(xì)胞進(jìn)行識別的模型呢?通常,我們先將數(shù)據(jù)輸入到模型,從而得到一個(gè)預(yù)測值,再將預(yù)測值與真實(shí)值結(jié)合,得到一個(gè)損失函數(shù),最后用梯度下降的方法來優(yōu)化損失函數(shù),從而不斷的更新模型的參數(shù) θ ,最后得到一個(gè)能夠正確對良性細(xì)胞和癌細(xì)胞進(jìn)行分類的模型。
在上一節(jié)中,我們知道要使用梯度下降算法首先要知道損失函數(shù)對參數(shù)的梯度,即損失函數(shù)對每個(gè)參數(shù)的偏導(dǎo),求解步驟如下:
loss=?ylna?(1?y)ln(1?a)
?w?loss?=?a?loss?.?z?a?.?w?z?
?a?loss?=?ay??1?a1?y?(?1)=a(1?a)a?y?
?z?a?=(1+e?z)2e?z?=a.(1?a)
?w?z?=x
?w?loss?=(a?y)x
其中a為預(yù)測值,y為真實(shí)值。 于是,在邏輯回歸中的梯度下降公式如下:
wi?=wi??η(a?y)xi?
訓(xùn)練流程:
同梯度下降算法流程:請參見上一關(guān)卡。
編程要求
根據(jù)提示,在右側(cè)編輯器Begin-End處補(bǔ)充 Python 代碼,構(gòu)建一個(gè)邏輯回歸模型,并對其進(jìn)行訓(xùn)練,最后將得到的邏輯回歸模型對癌細(xì)胞進(jìn)行識別。
測試說明
只需返回預(yù)測結(jié)果即可,程序內(nèi)部會檢測您的代碼,預(yù)測正確率高于 95% 視為過關(guān)。
提示:構(gòu)建模型時(shí) x0? 是添加在數(shù)據(jù)的左邊,請根據(jù)提示構(gòu)建模型,且返回theta形狀為(n,),n為特征個(gè)數(shù)。
開始你的任務(wù)吧,祝你成功!
# -*- coding: utf-8 -*-import numpy as np import warnings warnings.filterwarnings("ignore")def sigmoid(x):'''sigmoid函數(shù):param x: 轉(zhuǎn)換前的輸入:return: 轉(zhuǎn)換后的概率'''return 1/(1+np.exp(-x))def fit(x,y,eta=1e-3,n_iters=10000):'''訓(xùn)練邏輯回歸模型:param x: 訓(xùn)練集特征數(shù)據(jù),類型為ndarray:param y: 訓(xùn)練集標(biāo)簽,類型為ndarray:param eta: 學(xué)習(xí)率,類型為float:param n_iters: 訓(xùn)練輪數(shù),類型為int:return: 模型參數(shù),類型為ndarray'''# 請?jiān)诖颂砑訉?shí)現(xiàn)代碼 ##********** Begin *********#theta = np.zeros(x.shape[1])i_iter = 0while i_iter < n_iters:gradient = (sigmoid(x.dot(theta))-y).dot(x)theta = theta -eta*gradienti_iter += 1return theta#********** End **********#第5關(guān):手寫數(shù)字識別
- 任務(wù)描述
- 相關(guān)知識
- 數(shù)據(jù)簡介
- LogisticRegression
- 編程要求
- 測試說明
任務(wù)描述
本關(guān)任務(wù):使用sklearn中的LogisticRegression類完成手寫數(shù)字識別任務(wù)。
相關(guān)知識
為了完成本關(guān)任務(wù),你需要掌握如何使用sklearn提供的LogisticRegression類。
數(shù)據(jù)簡介
本關(guān)使用的是手寫數(shù)字?jǐn)?shù)據(jù)集,該數(shù)據(jù)集有 1797 個(gè)樣本,每個(gè)樣本包括 8*8 像素(實(shí)際上是一條樣本有 64 個(gè)特征,每個(gè)像素看成是一個(gè)特征,每個(gè)特征都是float類型的數(shù)值)的圖像和一個(gè) [0, 9] 整數(shù)的標(biāo)簽。比如下圖的標(biāo)簽是 2 :
sklearn為該數(shù)據(jù)集提供了接口,若想使用該數(shù)據(jù)集,代碼如下:
LogisticRegression
LogisticRegression中默認(rèn)實(shí)現(xiàn)了 OVR ,因此LogisticRegression可以實(shí)現(xiàn)多分類。LogisticRegression的構(gòu)造函數(shù)中有三個(gè)常用的參數(shù)可以設(shè)置:
solver:{'newton-cg' , 'lbfgs', 'liblinear', 'sag', 'saga'}, 分別為幾種優(yōu)化算法。默認(rèn)為liblinear;
C:正則化系數(shù)的倒數(shù),默認(rèn)為 1.0 ,越小代表正則化越強(qiáng);
max_iter:最大訓(xùn)練輪數(shù),默認(rèn)為 100 。
和sklearn中其他分類器一樣,LogisticRegression類中的fit函數(shù)用于訓(xùn)練模型,fit函數(shù)有兩個(gè)向量輸入:
X:大小為 [樣本數(shù)量,特征數(shù)量] 的ndarray,存放訓(xùn)練樣本;
Y:值為整型,大小為 [樣本數(shù)量] 的ndarray,存放訓(xùn)練樣本的分類標(biāo)簽。
LogisticRegression類中的predict函數(shù)用于預(yù)測,返回預(yù)測標(biāo)簽,predict函數(shù)有一個(gè)向量輸入:
- X:大小為[樣本數(shù)量,特征數(shù)量]的ndarray,存放預(yù)測樣本。
LogisticRegression的使用代碼如下:
編程要求
填寫digit_predict(train_sample, train_label, test_sample)函數(shù)完成手寫數(shù)字識別任務(wù),其中:
train_image:訓(xùn)練集圖像,類型為ndarray,shape=[-1, 8, 8];
train_label:訓(xùn)練集標(biāo)簽,類型為ndarray;
test_image:測試集圖像,類型為ndarray。
測試說明
只需返回預(yù)測結(jié)果即可,程序內(nèi)部會檢測您的代碼,預(yù)測正確率高于 0.97 視為過關(guān)。
開始你的任務(wù)吧,祝你成功!
from sklearn.linear_model import LogisticRegressiondef digit_predict(train_image, train_label, test_image):'''實(shí)現(xiàn)功能:訓(xùn)練模型并輸出預(yù)測結(jié)果:param train_sample: 包含多條訓(xùn)練樣本的樣本集,類型為ndarray,shape為[-1, 8, 8]:param train_label: 包含多條訓(xùn)練樣本標(biāo)簽的標(biāo)簽集,類型為ndarray:param test_sample: 包含多條測試樣本的測試集,類型為ndarry:return: test_sample對應(yīng)的預(yù)測標(biāo)簽'''#************* Begin ************#flat_train_image = train_image.reshape((-1, 64))# 訓(xùn)練集標(biāo)準(zhǔn)化train_min = flat_train_image.min()train_max = flat_train_image.max()flat_train_image = (flat_train_image-train_min)/(train_max-train_min)# 測試集變形flat_test_image = test_image.reshape((-1, 64))# 測試集標(biāo)準(zhǔn)化test_min = flat_test_image.min()test_max = flat_test_image.max()flat_test_image = (flat_test_image - test_min) / (test_max - test_min)# 訓(xùn)練--預(yù)測rf = LogisticRegression(C=4.0)rf.fit(flat_train_image, train_label)return rf.predict(flat_test_image)#************* End **************#總結(jié)
以上是生活随笔為你收集整理的EduCoder 机器学习 逻辑回归的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 879. 盈利计划
- 下一篇: EduCoder 机器学习 决策树