版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
scikitlearn機(jī)器學(xué)習(xí)(常用算法原理及編程實(shí)戰(zhàn))下部6-11章目錄\h第6章邏輯回歸算法\h6.1算法原理\h6.1.1預(yù)測(cè)函數(shù)\h6.1.2判定邊界\h6.1.3成本函數(shù)\h6.1.4梯度下降算法\h6.2多元分類\h6.3正則化\h6.3.1線性回歸模型正則化\h6.3.2邏輯回歸模型正則化\h6.4算法參數(shù)\h6.5實(shí)例:乳腺癌檢測(cè)\h6.5.1數(shù)據(jù)采集及特征提取\h6.5.2模型訓(xùn)練\h6.5.3模型優(yōu)化\h6.5.4學(xué)習(xí)曲線\h6.6拓展閱讀\h6.7復(fù)習(xí)題\h第7章決策樹\h7.1算法原理\h7.1.1信息增益\h7.1.2決策樹的創(chuàng)建\h7.1.3剪枝算法\h7.2算法參數(shù)\h7.3實(shí)例:預(yù)測(cè)泰坦尼克號(hào)幸存者\(yùn)h7.3.1數(shù)據(jù)分析\h7.3.2模型訓(xùn)練\h7.3.3優(yōu)化模型參數(shù)\h7.3.4模型參數(shù)選擇工具包\h7.4拓展閱讀\h7.4.1熵和條件熵\h7.4.2決策樹的構(gòu)建算法\h7.5集合算法\h7.5.1自助聚合算法Bagging\h7.5.2正向激勵(lì)算法boosting\h7.5.3隨機(jī)森林\h7.5.4ExtraTrees算法\h7.6復(fù)習(xí)題\h第8章支持向量機(jī)\h8.1算法原理\h8.1.1大間距分類算法\h8.1.2松弛系數(shù)\h8.2核函數(shù)\h8.2.1最簡(jiǎn)單的核函數(shù)\h8.2.2相似性函數(shù)\h8.2.3常用的核函數(shù)\h8.2.4核函數(shù)的對(duì)比\h8.3scikit-learn里的SVM\h8.4實(shí)例:乳腺癌檢測(cè)\h8.5復(fù)習(xí)題\h第9章樸素貝葉斯算法\h9.1算法原理\h9.1.1貝葉斯定理\h9.1.2樸素貝葉斯分類法\h9.2一個(gè)簡(jiǎn)單的例子\h9.3概率分布\h9.3.1概率統(tǒng)計(jì)的基本概念\h9.3.2多項(xiàng)式分布\h9.3.3高斯分布\h9.4連續(xù)值的處理\h9.5實(shí)例:文檔分類\h9.5.1獲取數(shù)據(jù)集\h9.5.2文檔的數(shù)學(xué)表達(dá)\h9.5.3模型訓(xùn)練\h9.5.4模型評(píng)價(jià)\h9.6復(fù)習(xí)題\h第10章PCA算法\h10.1算法原理\h10.1.1數(shù)據(jù)歸一化和縮放\h10.1.2計(jì)算協(xié)方差矩陣的特征向量\h10.1.3數(shù)據(jù)降維和恢復(fù)\h10.2PCA算法示例\h10.2.1使用Numpy模擬PCA計(jì)算過程\h10.2.2使用sklearn進(jìn)行PCA降維運(yùn)算\h10.2.3PCA的物理含義\h10.3PCA的數(shù)據(jù)還原率及應(yīng)用\h10.3.1數(shù)據(jù)還原率\h10.3.2加快監(jiān)督機(jī)器學(xué)習(xí)算法的運(yùn)算速度\h10.4實(shí)例:人臉識(shí)別\h10.4.1加載數(shù)據(jù)集\h10.4.2一次失敗的嘗試\h10.4.3使用PCA來處理數(shù)據(jù)集\h10.4.4最終結(jié)果\h10.5拓展閱讀\h10.6復(fù)習(xí)題\h第11章k-均值算法\h11.1算法原理\h11.1.1k-均值算法成本函數(shù)\h11.1.2隨機(jī)初始化聚類中心點(diǎn)\h11.1.3選擇聚類的個(gè)數(shù)\h11.2scikit-learn里的k-均值算法\h11.3使用k-均值對(duì)文檔進(jìn)行聚類分析\h11.3.1準(zhǔn)備數(shù)據(jù)集\h11.3.2加載數(shù)據(jù)集\h11.3.3文本聚類分析\h11.4聚類算法性能評(píng)估\h11.4.1AdjustRandIndex\h11.4.2齊次性和完整性\h11.4.3輪廓系數(shù)\h11.5復(fù)習(xí)題第6章
邏輯回歸算法邏輯回歸算法的名字里雖然帶有“回歸”二字,但實(shí)際上邏輯回歸算法是用來解決分類問題的算法。本章首先從二元分類入手,介紹了邏輯回歸算法的預(yù)測(cè)函數(shù)、成本函數(shù)和梯度下降算法公式;然后再介紹了怎樣由二元分類延伸到多元分類的問題;接著介紹了正則化,即通過數(shù)學(xué)的手段來解決模型過擬合問題;針對(duì)正則化,還介紹了L1范數(shù)和L2范數(shù)的含義及區(qū)別;最后用一個(gè)乳腺癌檢測(cè)的實(shí)例及其模型性能優(yōu)化來結(jié)束本章的內(nèi)容。本章涵蓋的內(nèi)容如下:·邏輯回歸算法的原理;·用梯度下降算法求解邏輯回歸算法的模型參數(shù);·正則化及正則化的作用;·L1范數(shù)和L2范數(shù)的含義及其作為模型正則項(xiàng)的區(qū)別;·用邏輯回歸算法解決乳腺癌檢測(cè)問題。6.1算法原理假設(shè)有一場(chǎng)足球賽,我們有兩支球隊(duì)的所有出場(chǎng)球員信息、歷史交鋒成績、比賽時(shí)間、主客場(chǎng)、裁判和天氣等信息,根據(jù)這些信息預(yù)測(cè)球隊(duì)的輸贏。假設(shè)比賽結(jié)果記為y,贏球標(biāo)記為1,輸球標(biāo)記為0,這個(gè)就是典型的二元分類問題,可以用邏輯回歸算法來解決。從這個(gè)例子里可以看出,邏輯回歸算法的輸出是個(gè)離散值,這是與線性回歸算法的最大區(qū)別。6.1.1預(yù)測(cè)函數(shù)需要找出一個(gè)預(yù)測(cè)函數(shù)模型,使其值輸出在[0,1]之間。然后選擇一個(gè)基準(zhǔn)值,如0.5,如果算出來的預(yù)測(cè)值大于0.5,就認(rèn)為其預(yù)測(cè)值為1,反之則其預(yù)測(cè)值為0。選擇來作為預(yù)測(cè)函數(shù),其中e是自然對(duì)數(shù)的底數(shù)。函數(shù)g(z)稱為Sigmoid函數(shù),也稱為Logistic函數(shù)。以z為橫坐標(biāo),以g(z)為縱坐標(biāo),畫出的圖形如圖6-1所示。圖6-1Sigmoid函數(shù)從圖中可以看出,當(dāng)z=0時(shí),g(z)=0.5。當(dāng)z>0時(shí),g(z)>0.5,當(dāng)z越來越大時(shí),g(z)無限接近于1。當(dāng)z<0時(shí),g(z)<0.5,當(dāng)z越來越小時(shí),g(z)無限接近于0。這正是我們想要的針對(duì)二元分類算法的預(yù)測(cè)函數(shù)。問題來了,怎樣把輸入特征和預(yù)測(cè)函數(shù)結(jié)合起來呢?結(jié)合線性回歸函數(shù)的預(yù)測(cè)函數(shù)hθ(x)=θTx,假設(shè)令z(x)=θTx,則邏輯回歸算法的預(yù)測(cè)函數(shù)如下:下面來解讀預(yù)測(cè)函數(shù)。hθ(x)表示在輸入值為x,參數(shù)為θ的前提條件下y=1的概率。用概率論的公式可以寫成:上面的概率公式可以讀成:在輸入x及參數(shù)θ條件下y=1的概率,這是個(gè)條件概率公式。由概率論的知識(shí)可以推導(dǎo)出對(duì)二元分類法來說,這是個(gè)非黑即白的世界。6.1.2判定邊界邏輯回歸算法的預(yù)測(cè)函數(shù)由下面兩個(gè)公式給出的:假定y=1的判定條件是hθ(x)≥0.5,y=0的判定條件是hθ(x)<0.5,則可以推導(dǎo)出y=1的判定條件就是θTx≥0,y=0的判定條件就是θTx<0。所以,θTx=0即是我們的判定邊界。下面給出兩個(gè)判定邊界的例子。假定有兩個(gè)變量x1,x2,其邏輯回歸預(yù)測(cè)函數(shù)是hθ(x)=g(θ0+θ1x1+θ2x2)。假設(shè)給定參數(shù)那么可以得到判定邊界-3+x1+x2=0,即x1+x2=3,如果以x1為橫坐標(biāo),x2為縱坐標(biāo),則這個(gè)函數(shù)畫出來就是一個(gè)通過(0,3)和(3,0)兩個(gè)點(diǎn)的斜線。這條線就是判定邊界,如圖6-2左圖所示。圖6-2判定邊界其中,直線左下角為y=0,直線右上解為y=1。橫坐標(biāo)為x1,縱坐標(biāo)為x2。如果預(yù)測(cè)函數(shù)是多項(xiàng)式且給定則可以得到判定邊界函數(shù)還是以x1為橫坐標(biāo),x2為縱坐標(biāo),則這是一個(gè)半徑為1的圓。圓內(nèi)部是y=0,圓外部是y=1,如圖6-2右圖所示。這是二階多項(xiàng)式的情況,更一般的多階多項(xiàng)式可以表達(dá)出更復(fù)雜的判定邊界。6.1.3成本函數(shù)我們不能使用線性回歸模型的成本函數(shù)來推導(dǎo)邏輯回歸的成本函數(shù),因?yàn)槟菢拥某杀竞瘮?shù)太復(fù)雜,最終很可能會(huì)導(dǎo)致無法通過迭代找到成本函數(shù)值最小的點(diǎn)。為了容易地求出成本函數(shù)的最小值,我們分成y=1和y=0兩種情況來分別考慮其預(yù)測(cè)值與真實(shí)值的誤差。我們先考慮最簡(jiǎn)單的情況,即計(jì)算某個(gè)樣本x,y其預(yù)測(cè)值與真實(shí)值的誤差,我們選擇的成本公式如下:其中,hθ(x)表示預(yù)測(cè)為1的概率,log(x)為自然對(duì)數(shù)。我們以hθ(x)為橫坐標(biāo),以成本值Cost(hθ(x),y)為縱坐標(biāo),把上述兩個(gè)公式分別畫在二維平面上,如圖6-3所示。圖6-3成本函數(shù)回顧成本的定義,成本是預(yù)測(cè)值與真實(shí)值的差異。當(dāng)差異越大時(shí),成本越大,模型受到的“懲罰”也越嚴(yán)重。在圖6-3左圖中,當(dāng)y=1時(shí),隨著hθ(x)的值(預(yù)測(cè)為1的概率)越來越大,預(yù)測(cè)值越來越接近真實(shí)值,其成本越來越小。在圖6-3左圖中,當(dāng)y=0時(shí),隨著hθ(x)的值(預(yù)測(cè)為1的概率)越來越大,預(yù)測(cè)值越來越偏離真實(shí)值,其成本越來越大。思考:符合上述規(guī)律的函數(shù)模型很多,為什么我們要選擇自然對(duì)數(shù)函數(shù)來作為成本函數(shù)呢?邏輯回歸模型的預(yù)測(cè)函數(shù)是Sigmoid函數(shù),而Sigmoid函數(shù)里有e的n次方運(yùn)算,自然對(duì)數(shù)剛好是其逆運(yùn)算,比如log(en)=n。選擇自然對(duì)數(shù),最終會(huì)推導(dǎo)出形式優(yōu)美的邏輯回歸模型參數(shù)的迭代函數(shù),而不需要去涉及對(duì)數(shù)運(yùn)算和指數(shù)函數(shù)運(yùn)算。這就是我們選擇自然對(duì)數(shù)函數(shù)來作為成本函數(shù)的原因。更進(jìn)一步,把輸入值x從負(fù)無窮大到正無窮大映射到[0,1]區(qū)間的模型很多,邏輯回歸算法為什么要選擇Sigmoid函數(shù)作為預(yù)測(cè)函數(shù)的模型呢?嚴(yán)格地講,不一定非要選擇Sigmoid函數(shù)作為預(yù)測(cè)函數(shù)。但如果不選擇Sigmoid函數(shù),就需要重新選擇性質(zhì)接近的成本函數(shù),這樣才能在數(shù)學(xué)上得到既方便表達(dá)、效率又高的成本函數(shù)。下面來看成本函數(shù)的統(tǒng)一寫法問題。分開表述的成本計(jì)算公式始終不方便,能不能合并成一個(gè)公式呢?考慮下面的公式:由于是離散值,當(dāng)y=1時(shí),1-y=0,上式的后半部分為0;當(dāng)y=0時(shí),上式的前半部分為0。因此上式與分開表達(dá)的成本計(jì)算公式是等價(jià)的。介紹到這里,成本函數(shù)就要隆重登場(chǎng)了。根據(jù)一個(gè)樣本的成本計(jì)算公式,很容易寫出所有樣本的成本平均值,即成本函數(shù):6.1.4梯度下降算法和線性回歸類似,我們使用梯度下降算法來求解邏輯回歸模型參數(shù)。根據(jù)梯度下降算法的定義,可以得出:這里的關(guān)鍵是求解成本函數(shù)的偏導(dǎo)數(shù)。最終推導(dǎo)出來的梯度下降算法公式為:對(duì)公式推導(dǎo)過程感興趣的同學(xué),可以參閱本章擴(kuò)展閱讀的內(nèi)容。這個(gè)公式的形式和線性回歸算法的參數(shù)迭代公式是一樣的。當(dāng)然,由于這里而線性回歸算法里hθ(x)=θTx。所以,兩者的形式一樣,但數(shù)值計(jì)算方法則完全不同。至此,我們就把邏輯回歸算法的相關(guān)原理解釋清楚了。6.2多元分類邏輯回歸模型可以解決二元分類問題,即y={0,1},能不能用來解決多元分類問題呢?答案是肯定的。針對(duì)多元分類問題,y={0,1,2,…,n},總共有n+1個(gè)類別。其解決思路是,首先把問題轉(zhuǎn)化為二元分類問題,即y=0是一個(gè)類別,y={1,2,…,n}作為另外一個(gè)類別,然后計(jì)算這兩個(gè)類別的概率;接著,把y=1作為一個(gè)類別,把y={0,2,…,n}作為另外一個(gè)類別,再計(jì)算這兩個(gè)類別的概率。由此推廣開,總共需要n+1個(gè)預(yù)測(cè)函數(shù):預(yù)測(cè)出來的概率最高的那個(gè)類別,就是樣本所屬的類別。6.3正則化回憶第3章介紹的理論知識(shí),過擬合是指模型很好地?cái)M合了訓(xùn)練樣本,但對(duì)新數(shù)據(jù)預(yù)測(cè)的準(zhǔn)確性很差,這是因?yàn)槟P吞珡?fù)雜了。解決辦法是減少輸入特征的個(gè)數(shù),或者獲取更多的訓(xùn)練樣本。這里介紹的正則化也是用來解決模型過擬合問題的一個(gè)方法?!けA羲械奶卣?,減小特征的權(quán)重θj的值。確保所有的特征對(duì)預(yù)測(cè)值都有少量的貢獻(xiàn)?!ぎ?dāng)每個(gè)特征xi對(duì)預(yù)測(cè)值y都有少量的貢獻(xiàn)時(shí),這樣的模型可以良好地工作,這就是正則化的目的,可以用它來解決特征過多時(shí)的過擬合問題。6.3.1線性回歸模型正則化我們先來看線性回歸模型的成本函數(shù)是如何正則化的:公式中前半部分就是原來我們學(xué)過的線性回歸模型的成本函數(shù),也稱為預(yù)測(cè)值與實(shí)際值的誤差。后半部分為加入的正則項(xiàng)。其中λ的值有兩個(gè)目的,即要維持對(duì)訓(xùn)練樣本的擬合,又要避免對(duì)訓(xùn)練樣本的過擬合。如果λ值太大,則能確保不出現(xiàn)過擬合,但可能會(huì)導(dǎo)致對(duì)現(xiàn)有訓(xùn)練樣本出現(xiàn)欠擬合。思考:怎樣從數(shù)學(xué)上理解正則化后的成本函數(shù)解決了過擬合問題呢?從數(shù)學(xué)角度來看,成本函數(shù)增加了一個(gè)正則項(xiàng)后,成本函數(shù)不再唯一地由預(yù)測(cè)值與真實(shí)值的誤差所決定,還和參數(shù)θ的大小有關(guān)。有了這個(gè)限制之后,要實(shí)現(xiàn)成本函數(shù)最小的目的,θ就不能隨便取值了。比如某個(gè)比較大的θ值可能會(huì)讓預(yù)測(cè)值與真實(shí)值的誤差(hθ(x(i))-y(i))2值很小,但會(huì)導(dǎo)致很大,最終的結(jié)果是成本函數(shù)太大。這樣,通過調(diào)節(jié)參數(shù)λ,就可以控制正則項(xiàng)的權(quán)重,從而避免線性回歸算法過擬合。利用正則化的成本函數(shù),可以推導(dǎo)出正則化后的參數(shù)迭代函數(shù):因子在每次迭代時(shí)都將把θj收縮一點(diǎn)點(diǎn)。因?yàn)棣梁挺耸钦龜?shù),而m是訓(xùn)練樣例的個(gè)數(shù),是個(gè)比較大的正整數(shù)。為什么要對(duì)θj進(jìn)行收縮呢?因?yàn)榧尤胝齽t項(xiàng)的成本函數(shù)和成正比,所以迭代時(shí)需要不斷地試圖減小θj的值。6.3.2邏輯回歸模型正則化使用相同的思路,我們可以對(duì)邏輯回歸模型的成本函數(shù)進(jìn)行正則化,其方法也是在原來的成本函數(shù)基礎(chǔ)上加上正則項(xiàng):相應(yīng)地,正則化后的參數(shù)迭代公式為:需要注意的是,上式中j≥1,因?yàn)棣?沒有參與正則化。另外需要留意,邏輯回歸和線性回歸的參數(shù)迭代算法看起來形式是一樣的,但其實(shí)它們的算法不一樣,因?yàn)閮蓚€(gè)式子的預(yù)測(cè)函數(shù)hθ(x)不一樣。針對(duì)線性回歸hθ(x)=θTx,而針對(duì)邏輯回歸6.4算法參數(shù)在scikit-learn里,邏輯回歸模型由類sklearn.linear_model.LogisticRegression實(shí)現(xiàn)。1.正則項(xiàng)權(quán)重我們上面介紹的正則項(xiàng)權(quán)重λ,在LogisticRegression里有個(gè)參數(shù)C與此對(duì)應(yīng),但成反比。即C值越大,正則項(xiàng)的權(quán)重越小,模型容易出現(xiàn)過擬合;C值越小,正則項(xiàng)權(quán)重越大,模型容易出現(xiàn)欠擬合。2.L1/L2范數(shù)創(chuàng)建邏輯回歸模型時(shí),有個(gè)參數(shù)penalty,其取值有'l1'或'l2',這是什么意思呢?這個(gè)實(shí)際上就是指定我們前面介紹的正則項(xiàng)的形式?;仡欀敖榻B的內(nèi)容,在成本函數(shù)里添加的正則項(xiàng)為這個(gè)實(shí)際上是個(gè)L2正則項(xiàng),即把L2范數(shù)作為正則項(xiàng)。聰明的你猜到了,我們也可以添加L1范數(shù)來作為正則項(xiàng)。L1范數(shù)作為正則項(xiàng),會(huì)讓模型參數(shù)θ稀疏化,即讓模型參數(shù)向量里為0的元素盡量多。而L2范數(shù)作為正則項(xiàng),則是讓模型參數(shù)盡量小,但不會(huì)為0,即盡量讓每個(gè)特征對(duì)預(yù)測(cè)值都有一些小的貢獻(xiàn)。問題來了,為什么會(huì)造成上述不同的結(jié)果呢?要解釋清楚原因,就需要先了解一下L1范數(shù)和L2范數(shù)的概念,它們都是針對(duì)向量的一種運(yùn)算。為了簡(jiǎn)單起見,假設(shè)模型只有兩個(gè)參數(shù),它們構(gòu)成一個(gè)二維向量θ=[θ1,θ2],則L1范數(shù)為:即L1范數(shù)是向量里元素的絕對(duì)值之和,L2范數(shù)為元素的平方和的開方根:定義清楚了之后,我們來介紹它們作為正則項(xiàng)的效果有什么不同?;仡櫟?章介紹的內(nèi)容,梯度下降算法在參數(shù)迭代的過程中,實(shí)際上是在成本函數(shù)的等高線上跳躍,并最終收斂在誤差(為了避免誤解,此處稱未加正則項(xiàng)之前的成本為誤差)最小的點(diǎn)上。我們先思考一下,正則項(xiàng)的本質(zhì)是什么?正則項(xiàng)的本質(zhì)是懲罰。模型在訓(xùn)練的過程中,如果沒有遵守正則項(xiàng)所表達(dá)的規(guī)則,那么其成本會(huì)變大,即受到了懲罰,從而往正則項(xiàng)所表達(dá)的規(guī)則處收斂。成本函數(shù)在這兩項(xiàng)規(guī)則的綜合作用下,正則化后的模型參數(shù)應(yīng)該收斂在誤差等值線與正則項(xiàng)等值線相切的點(diǎn)上。我們把L1范數(shù)和L2范數(shù)在二維坐標(biāo)軸上畫出其圖形,即可直觀地看到它們所表達(dá)的規(guī)則的不同。如圖6-4所示為使用matplotlib畫的L1和L2范數(shù)示意圖,感興趣的讀者可參閱隨書代碼ch06.01.ipynb。在圖6-4左圖中,我們用的是L1范數(shù)來作為正則項(xiàng),L1范數(shù)表示的是元素的絕對(duì)值之和,圖中L1范數(shù)的值為1,其在θ1,θ2坐標(biāo)軸上的等值線是個(gè)正方形,虛線表示的是誤差等值線??梢钥吹?,誤差等值線和L1范數(shù)等值線相切的點(diǎn)位于坐標(biāo)軸上。在圖6-4右圖中,我們用的是L2范數(shù)來作為正則項(xiàng),圖中L2范數(shù)的值為1,在θ1,θ2坐標(biāo)軸上,它的等值線是一個(gè)圓。它和模型誤差等值線相切的點(diǎn),一般不在坐標(biāo)軸上。至此,我們就清楚了,L1范數(shù)作為正則項(xiàng),會(huì)讓模型參數(shù)稀疏化,而L2范數(shù)作為正則項(xiàng),則會(huì)使模型的特征對(duì)預(yù)測(cè)值都有少量的貢獻(xiàn),避免模型過擬合。作為推論,L1范數(shù)作為正則項(xiàng),有以下幾個(gè)用途?!ぬ卣鬟x擇:它會(huì)讓模型參數(shù)向量里的元素為0的點(diǎn)盡量多。因此可以排除掉那些對(duì)預(yù)測(cè)值沒有什么影響的特征。從而簡(jiǎn)化問題。所以L1范數(shù)解決過擬合的措施,實(shí)際上是減少特征數(shù)量?!た山忉屝裕耗P蛥?shù)向量稀疏化后,只會(huì)留下那些對(duì)預(yù)測(cè)值有重要影響的特征。這樣我們就容易解釋模型的因果關(guān)系。比如,針對(duì)某種癌癥的篩查,如果有100個(gè)特征,那么我們無從解釋到底哪些特征對(duì)陽性呈關(guān)鍵作用。稀疏化后,只留下幾個(gè)關(guān)鍵的特征,就容易看到因果關(guān)系。由此可見,L1范數(shù)作為正則項(xiàng),更多的是一個(gè)分析工具,而適合用來對(duì)模型求解。因?yàn)樗鼤?huì)把不重要的特征直接去除。大部分情況下,我們解決過擬合問題,還是選擇L2范數(shù)作為正則項(xiàng),這也是scikit-learn里的默認(rèn)值。圖6-4L1、L2范數(shù)6.5實(shí)例:乳腺癌檢測(cè)本節(jié)來看一個(gè)實(shí)例,使用邏輯回歸算法解決乳腺癌檢測(cè)問題。我們需要先采集腫瘤病灶造影圖片,然后對(duì)圖片進(jìn)行分析,從圖片中提取特征,再根據(jù)特征來訓(xùn)練模型。最終使用模型來檢測(cè)新采集到的腫瘤病灶造影,以便判斷腫瘤是良性的還是惡性的。這是個(gè)典型的二元分類問題。6.5.1數(shù)據(jù)采集及特征提取在工程應(yīng)用中,數(shù)據(jù)采集和特征提取工作往往決定著項(xiàng)目的成敗。讀者可以思考一下,我們要獲取足夠多數(shù)量的良性和惡性分布合理的腫瘤病灶造影圖片,需要多大的線下工作?當(dāng)然,這一工作一般會(huì)以科研中心和醫(yī)院合作的形式來獲取數(shù)據(jù)。其次,拿到病灶造影圖片后,要分析圖片、提取特征,這也是個(gè)費(fèi)心傷神的工作。哪些特征有助于我們預(yù)測(cè)腫瘤的良性或惡性?這都是值得深入思考和實(shí)踐的問題。最后,決定要提取的特征集合,還需要編寫圖片處理程序,以便從病灶造影圖片中提出我們需要的特征。為了簡(jiǎn)單起見,我們直接加載scikit-learn自帶的一個(gè)乳腺癌數(shù)據(jù)集。這個(gè)數(shù)據(jù)集是已經(jīng)采集后的數(shù)據(jù):#載入數(shù)據(jù)
fromsklearn.datasetsimportload_breast_cancer
cancer=load_breast_cancer()
X=cancer.data
y=cancer.target
print('datashape:{0};no.positive:{1};no.negative:{2}'.format(
X.shape,y[y==1].shape[0],y[y==0].shape[0]))
print(cancer.data[0])
上述代碼輸出結(jié)果如下:datashape:(569,30);no.positive:357;no.negative:212
[1.79900000e+011.03800000e+011.22800000e+021.00100000e+03
1.18400000e-012.77600000e-013.00100000e-011.47100000e-01
2.41900000e-017.87100000e-021.09500000e+009.05300000e-01
8.58900000e+001.53400000e+026.39900000e-034.90400000e-02
5.37300000e-021.58700000e-023.00300000e-026.19300000e-03
2.53800000e+011.73300000e+011.84600000e+022.01900000e+03
1.62200000e-016.65600000e-017.11900000e-012.65400000e-01
4.60100000e-011.18900000e-01]
我們可以看到,數(shù)據(jù)集中總共有569個(gè)樣本,每個(gè)樣本有30個(gè)特征,其中357個(gè)陽性(y=1)樣本,212個(gè)陰性(y=0)樣本。同時(shí),我們還打印出一個(gè)樣本數(shù)據(jù),以便直觀地進(jìn)行觀察。為了強(qiáng)調(diào)特征提取工作的重要性,這里介紹一下這些特征值的物理含義,讀者也可以思考一下,如果讓你來提取特征,你會(huì)怎么做?這個(gè)數(shù)據(jù)集總共從病灶造影圖片中提取了以下10個(gè)關(guān)鍵屬性?!adius:半徑,即病灶中心點(diǎn)離邊界的平均距離?!exture:紋理,灰度值的標(biāo)準(zhǔn)偏差?!erimeter:周長,即病灶的大小?!rea:面積,也是反映病灶大小的一個(gè)指標(biāo)?!moothness:平滑度,即半徑的變化幅度?!ompactness:密實(shí)度,周長的平方除以面積的商,再減1,即·concavity:凹度,凹陷部分輪廓的嚴(yán)重程度。·concavepoints:凹點(diǎn),凹陷輪廓的數(shù)量?!ymmetry:對(duì)稱性?!ractaldimension:分形維度。從這些指標(biāo)里,可以看出,有些指標(biāo)屬于“復(fù)合”指標(biāo),即由其他的指標(biāo)經(jīng)過運(yùn)算得到的。比如密實(shí)度,是由周長和面積計(jì)算出來的。不要小看這種運(yùn)算構(gòu)建出來的新特征,這是事物內(nèi)在邏輯關(guān)系的體現(xiàn)。舉個(gè)例子,我們需要監(jiān)控?cái)?shù)據(jù)中心中每臺(tái)物理主機(jī)的運(yùn)行情況,其中CPU占用率、內(nèi)存占用率、網(wǎng)絡(luò)吞吐量是幾個(gè)重要的指標(biāo)。問:有臺(tái)主機(jī)CPU占用率80%,這個(gè)主機(jī)狀態(tài)是否正常?要不要發(fā)布告警?答:看情況。僅從CPU占用率來看還不能判斷主機(jī)是否正常,還要看內(nèi)存占用情況和網(wǎng)絡(luò)吞吐量情況。如果此時(shí)內(nèi)存占用也成比例上升,且網(wǎng)絡(luò)吞吐量也在合理的水平,那么造成這一狀態(tài)的可能是用戶訪問的流量過大,導(dǎo)致主機(jī)負(fù)荷增加,不需要告警。但如果內(nèi)存占用、網(wǎng)絡(luò)吞量和CPU占用不在同一量級(jí),那么這臺(tái)主機(jī)就可能處于不正常的狀態(tài)。所以,我們需要構(gòu)建一個(gè)復(fù)合特征,如CPU占用率和內(nèi)存占用率的比值,以及CPU占用率和網(wǎng)絡(luò)吞吐量的比值,這樣構(gòu)造出來的特征更真實(shí)地體現(xiàn)出了現(xiàn)實(shí)問題中的內(nèi)在規(guī)則。所以,提取特征時(shí),不妨從事物的內(nèi)在邏輯關(guān)系入手,分析已有特征之間的關(guān)系,從而構(gòu)造出新的特征。這一方法在實(shí)際工程應(yīng)用中是常用的特征提取手段?;氐轿覀冇懻摰娜橄侔?shù)據(jù)集的特征問題中,實(shí)際上它只關(guān)注10個(gè)特征,然后又構(gòu)造出了每個(gè)特征的標(biāo)準(zhǔn)差及最大值,這樣每個(gè)特征就又衍生出了兩個(gè)特征,所以總共就有了30個(gè)特征。可以通過cancer.feature_names變量來查看這些特征的名稱。6.5.2模型訓(xùn)練閱讀過前面章節(jié)的讀者應(yīng)該很熟悉這里的步驟了,因?yàn)閟cikit-learn提供了一致的接口調(diào)用,使用起來非常方便。首先,我們把數(shù)據(jù)集分成訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集。fromsklearn.model_selectionimporttrain_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
然后,我們使用LogisticRegression模型來訓(xùn)練,并計(jì)算訓(xùn)練數(shù)據(jù)集的評(píng)分?jǐn)?shù)據(jù)和測(cè)試數(shù)據(jù)集的評(píng)分?jǐn)?shù)據(jù):#模型訓(xùn)練
fromsklearn.linear_modelimportLogisticRegression
model=LogisticRegression()
model.fit(X_train,y_train)
train_score=model.score(X_train,y_train)
test_score=model.score(X_test,y_test)
print('trainscore:{train_score:.6f};testscore:{test_score:.6f}'.
format(
train_score=train_score,test_score=test_score))
在筆者計(jì)算機(jī)上的輸出如下:trainscore:0.953846;testscore:0.973684#看起來效果不錯(cuò)
我們還可以看一下測(cè)試樣本中,有幾個(gè)是預(yù)測(cè)正確的:#樣本預(yù)測(cè)
y_pred=model.predict(X_test)
print('matchs:{0}/{1}'.format(np.equal(y_pred,y_test).shape[0],y_test.shape[0]))
筆者計(jì)算機(jī)上的輸出如下:matchs:114/114
總共114個(gè)測(cè)試樣本,全部預(yù)測(cè)正確。這里有個(gè)疑問,為什么全部都預(yù)測(cè)正確,而testscore卻只有0.973684,而不是1呢?答案是,scikit-learn不是使用這個(gè)數(shù)據(jù)來計(jì)算分?jǐn)?shù),因?yàn)檫@個(gè)數(shù)據(jù)不能完全反映誤差情況,而是使用預(yù)測(cè)概率數(shù)據(jù)來計(jì)算模型評(píng)分。針對(duì)二元分類問題,LogisticRegression模型會(huì)針對(duì)每個(gè)樣本輸出兩個(gè)概率,即為0的概率和為1的概率,哪個(gè)概率高就預(yù)測(cè)為哪個(gè)類別。我們可以找出針對(duì)測(cè)試數(shù)據(jù)集,模型預(yù)測(cè)的“自信度”低于90%的樣本。怎樣找出這些樣本呢?我們先計(jì)算出測(cè)試數(shù)據(jù)集里的每個(gè)樣本的預(yù)測(cè)概率數(shù)據(jù),針對(duì)每個(gè)樣本,它會(huì)有兩個(gè)數(shù)據(jù),一是預(yù)測(cè)其為陽性的概率,另外一個(gè)是預(yù)測(cè)其為陰性的概率。接著找出預(yù)測(cè)為陰性的概率大于0.1的樣本,然后在結(jié)果集里,找出預(yù)測(cè)為陽性的概率也大于0.1的樣本,這樣就找出了模型預(yù)測(cè)“自信度”低于90%的樣本。這是因?yàn)樗蓄悇e的預(yù)測(cè)概率加起來,一定是100%,兩個(gè)都大于0.1,則其最大的值一定是小于90%,即“自信度”不足90%。我們可以看下概率數(shù)據(jù):#預(yù)測(cè)概率:找出預(yù)測(cè)概率低于90%的樣本
y_pred_proba=model.predict_proba(X_test)#計(jì)算每個(gè)測(cè)試樣本的預(yù)測(cè)概率
#打印出第一個(gè)樣本的數(shù)據(jù),以便讀者了解數(shù)據(jù)形式
print('sampleofpredictprobability:{0}'.format(y_pred_proba[0]))
#找出第一列,即預(yù)測(cè)為陰性的概率大于0.1的樣本,保存在result里
y_pred_proba_0=y_pred_proba[:,0]>0.1
result=y_pred_proba[y_pred_proba_0]
#在result結(jié)果集里,找出第二列,即預(yù)測(cè)為陽性的概率大于0.1的樣本
y_pred_proba_1=result[:,1]>0.1
print(result[y_pred_proba_1])
筆者計(jì)算機(jī)上的輸出如下:sampleofpredictprobability:[1.00000000e+002.13344552e-47]
[[0.141626280.85837372]
[0.774988940.22501106]
[0.721473470.27852653]
[0.144363910.85563609]
[0.353425870.64657413]
[0.896765230.10323477]
[0.13377270.8662273]
[0.17092610.8290739]
[0.164020160.83597984]
[0.796572040.20342796]
[0.763685220.23631478]]
我們使用model.predict_proba()來計(jì)算概率,同時(shí)找出那些預(yù)測(cè)“自信度”低于90%的樣本??梢钥吹?,最沒有把握的樣本是[0.353425870.64657413],即只有64.66%的概率是陽性。讀者朋友們?nèi)绻\(yùn)行這個(gè)實(shí)例,輸出結(jié)果可能會(huì)略有差異,因?yàn)橛?xùn)練樣本和測(cè)試樣本是隨機(jī)分配的。6.5.3模型優(yōu)化我們使用LogisticRegression模型的默認(rèn)參數(shù)訓(xùn)練出來的模型,準(zhǔn)確性看起來還是挺高的。問題是,有沒有優(yōu)化空間呢?如果有,往哪個(gè)方向優(yōu)化呢?我們先嘗試增加多項(xiàng)式特征,實(shí)際上,多項(xiàng)式特征和上文介紹的人為添加的復(fù)合特征類似,都是從已有特征經(jīng)過數(shù)學(xué)運(yùn)算得來的。只是這里的邏輯關(guān)系沒那么明顯。所幸,雖然我們不能直觀地理解多項(xiàng)式特征的邏輯關(guān)系,但是有一些方法和工具可以用來過濾出那些對(duì)模型準(zhǔn)確性有幫助的特征。首先,我們使用Pipeline來增加多項(xiàng)式特征,就像在前面章節(jié)介紹的那樣:fromsklearn.linear_modelimportLogisticRegression
fromsklearn.preprocessingimportPolynomialFeatures
fromsklearn.pipelineimportPipeline
#增加多項(xiàng)式預(yù)處理
defpolynomial_model(degree=1,**kwarg):
polynomial_features=PolynomialFeatures(degree=degree,
include_bias=False)
logistic_regression=LogisticRegression(**kwarg)
pipeline=Pipeline([("polynomial_features",polynomial_features),
("logistic_regression",logistic_regression)])
returnpipeline
接著,增加二階多項(xiàng)式特征,創(chuàng)建并訓(xùn)練模型:importtime
model=polynomial_model(degree=2,penalty='l1')
start=time.clock()
model.fit(X_train,y_train)
train_score=model.score(X_train,y_train)
cv_score=model.score(X_test,y_test)
print('elaspe:{0:.6f};train_score:{1:0.6f};cv_score:{2:.6f}'.format(
time.clock()-start,train_score,cv_score))
我們使用L1范數(shù)作為正則項(xiàng)(參數(shù)penalty='l1'),在筆者計(jì)算機(jī)上的輸出如下:elaspe:0.504948;train_score:0.997802;cv_score:0.982456
可以看到,訓(xùn)練數(shù)據(jù)集評(píng)分和測(cè)試數(shù)據(jù)集評(píng)分都增加了。為什么使用L1范數(shù)作為正則項(xiàng)呢?前面介紹過,L1范數(shù)作為正則項(xiàng),可以實(shí)現(xiàn)參數(shù)的稀疏化,即自動(dòng)幫助我們選擇出那些對(duì)模型有關(guān)聯(lián)的特征。我們可以觀察一下有多少個(gè)特征沒有被丟棄,即其對(duì)應(yīng)的模型參數(shù)θj非0:logistic_regression=d_steps['logistic_regression']
print('modelparametersshape:{0};countofnon-zeroelement:{1}'.format(
logistic_regression.coef_.shape,
np.count_nonzero(logistic_regression.coef_)))
輸出結(jié)果如下:modelparametersshape:(1,495);countofnon-zeroelement:94
邏輯回歸模型的coef_屬性里保存的就是模型參數(shù)。從輸出結(jié)果可以看到,增加二階多項(xiàng)式特征后,輸入特征由原來的30個(gè)增加到了495個(gè),最終大多數(shù)特征都被丟棄,只保留了94個(gè)有效特征。6.5.4學(xué)習(xí)曲線有的讀者可能會(huì)問,怎么知道使用L1=范數(shù)作為正則項(xiàng)能提高算法的準(zhǔn)確性?答案是:畫出學(xué)習(xí)曲線。學(xué)習(xí)曲線是模型最有效的診斷工具之一,這也是之前章節(jié)一直強(qiáng)調(diào)的內(nèi)容。首先畫出使用L1范數(shù)作為正則項(xiàng)所對(duì)應(yīng)的一階和二階多項(xiàng)式的學(xué)習(xí)曲線:fromcommon.utilsimportplot_learning_curve
fromsklearn.model_selectionimportShuffleSplit
cv=ShuffleSplit(n_splits=10,test_size=0.2,random_state=0)
title='LearningCurves(degree={0},penalty={1})'
degrees=[1,2]
penalty='l1'
start=time.clock()
plt.figure(figsize=(12,4),dpi=144)
foriinrange(len(degrees)):
plt.subplot(1,len(degrees),i+1)
plot_learning_curve(plt,
polynomial_model(degree=degrees[i],
penalty=penalty),
title.format(degrees[i],penalty),
X,
y,
ylim=(0.8,1.01),
cv=cv)
print('elaspe:{0:.6f}'.format(time.clock()-start))
這段代碼讀者應(yīng)該不會(huì)陌生吧,其輸出的學(xué)習(xí)曲線如圖6-5所示。接著畫出使用L2范數(shù)作為正則項(xiàng)所對(duì)應(yīng)的一階和二階多項(xiàng)式的學(xué)習(xí)曲線:penalty='l2'
start=time.clock()
plt.figure(figsize=(12,4),dpi=144)
foriinrange(len(degrees)):
plt.subplot(1,len(degrees),i+1)
plot_learning_curve(plt,
polynomial_model(degree=degrees[i],
penalty=penalty,
solver='lbfgs'),
title.format(degrees[i],penalty),
X,
y,
ylim=(0.8,1.01),
cv=cv)
print('elaspe:{0:.6f}'.format(time.clock()-start))
圖6-5L1范數(shù)學(xué)習(xí)曲線學(xué)習(xí)曲線如圖6-6所示。圖6-6L2范數(shù)學(xué)習(xí)曲線從圖6-5和圖6-6中可以明顯地看出,使用二階多項(xiàng)式并使用L1范數(shù)作為正則項(xiàng)的模型最優(yōu),因?yàn)樗挠?xùn)練樣本評(píng)分最高,交叉驗(yàn)證樣本評(píng)分也最高。從圖中還可以看出,訓(xùn)練樣本評(píng)分和交叉驗(yàn)證樣本評(píng)分之間的間隙還比較大,我們可以采集更多的數(shù)據(jù)來訓(xùn)練模型,以便進(jìn)一步優(yōu)化模型。本實(shí)例的代碼,請(qǐng)參閱隨書代碼ch06.02.ipynb。如果讀者運(yùn)行了示例代碼,會(huì)發(fā)現(xiàn)畫L1范數(shù)對(duì)應(yīng)的學(xué)習(xí)曲線時(shí),需要花比較長的時(shí)間,在筆者的計(jì)算機(jī)(MacbookProRetina,13-inch2.6GHzIntelCorei5)上,總共用時(shí)15.587002秒。原因是,scikit-learn的learning_curve()函數(shù)在畫學(xué)習(xí)曲線的過程中,要對(duì)模型進(jìn)行多次訓(xùn)練,并計(jì)算交叉驗(yàn)證樣本評(píng)分。同時(shí),為了使曲線更平滑,針對(duì)每個(gè)點(diǎn)還會(huì)進(jìn)行多次計(jì)算求平均值。這個(gè)就是ShuffleSplit類的作用。在我們這個(gè)實(shí)例里,只有569個(gè)訓(xùn)練樣本,這是個(gè)很小的數(shù)據(jù)集。如果數(shù)據(jù)集增加100倍,甚至1000倍,拿出來畫學(xué)習(xí)曲線將是場(chǎng)災(zāi)難。問題來了,針對(duì)大數(shù)據(jù)集,怎樣高效地畫學(xué)習(xí)曲線?答案很簡(jiǎn)單,我們可以從大數(shù)據(jù)集里選擇一小部分?jǐn)?shù)據(jù)來畫學(xué)習(xí)曲線,待選擇好最優(yōu)的模型之后,再使用全部的數(shù)據(jù)集來訓(xùn)練模型。有個(gè)地方需要注意,我們要盡量保持選擇出來的這部分?jǐn)?shù)據(jù)的標(biāo)簽分布與大數(shù)據(jù)集的標(biāo)簽分布相同,如針對(duì)二元分類,陽性和陰性比例要一致。6.6拓展閱讀本章的擴(kuò)展閱讀涉及較多的數(shù)學(xué)知識(shí),閱讀有困難的同學(xué)可跳過。感興趣的同學(xué),可順著筆者指引的一些資料,找到更多的閱讀資料。1.梯度下降公式推導(dǎo)關(guān)于邏輯回歸模型的梯度下降公式的推導(dǎo)過程,感興趣的同學(xué)可以參閱筆者的一篇博客\h/logistic-regression.html。2.向量形式實(shí)際上,我們的預(yù)測(cè)函數(shù)就是寫成向量形式的:這個(gè)預(yù)測(cè)函數(shù)一次只計(jì)算一個(gè)訓(xùn)練樣本的預(yù)測(cè)值,我們要怎樣一次性計(jì)算出所有樣本的預(yù)測(cè)值呢?上述公式即可達(dá)到目的。其中g(shù)(x)為Sigmoid函數(shù)。X為m×n的矩陣,即數(shù)據(jù)集的矩陣表達(dá)。成本函數(shù)也有對(duì)應(yīng)的矩陣形式:其中,y為目標(biāo)值向量,h為一次性計(jì)算出來的所有樣本的預(yù)測(cè)值。3.算法性能優(yōu)化梯度下降算法的效率比較低,優(yōu)化的梯度下降算法有ConjugateGradient、BFGS、L-BFGS等。這些算法比較復(fù)雜,實(shí)現(xiàn)這些算法是數(shù)值計(jì)算專家的工作,一般工程人員只需要知道這些算法是怎么優(yōu)化的以及怎么使用這些算法即可。感興趣的讀者可以搜索這些算法的關(guān)鍵詞,會(huì)有大量的介紹資料。6.7復(fù)習(xí)題1.邏輯回歸模型是解決什么問題的模型?2.邏輯回歸模型的預(yù)測(cè)函數(shù)是什么?3.邏輯回歸模型的成本函數(shù)是什么?4.邏輯回歸模型的梯度下降算法中,其參數(shù)迭代公式是什么?5.正則項(xiàng)有什么作用?6.L1范式正則項(xiàng)和L2范式正則項(xiàng)有什么區(qū)別?7.運(yùn)行ch06.02.ipynb實(shí)例,修改代碼,在不引入多項(xiàng)式特征的情況下,觀察使用L1和L2范數(shù)作為正則項(xiàng),其訓(xùn)練出來的模型參數(shù)有什么區(qū)別?8.運(yùn)行ch06.02.ipynb實(shí)例,試試用三階多項(xiàng)式擬合模型有什么效果?引入三階多項(xiàng)式后會(huì)有多少個(gè)特征?使用L1范數(shù)作為正則項(xiàng),有多少項(xiàng)非零參數(shù)?第7章
決策樹決策樹是最經(jīng)典的機(jī)器學(xué)習(xí)模型之一。它的預(yù)測(cè)結(jié)果容易理解,易于向業(yè)務(wù)部門解釋,預(yù)測(cè)速度快,可以處理類別型數(shù)據(jù)和連續(xù)型數(shù)據(jù)。在機(jī)器學(xué)習(xí)的數(shù)據(jù)挖掘類求職面試中,決策樹是面試官最喜歡的面試題之一。通過本章讀者可以掌握以下內(nèi)容:·信息熵及信息增益的概念,以及決策樹的分裂的原則;·決策樹的創(chuàng)建及剪枝算法;·scikit-learn中決策樹算法的相關(guān)參數(shù);·使用決策樹預(yù)測(cè)泰坦尼克號(hào)幸存者實(shí)例;·scikit-learn中模型參數(shù)選擇的工具及使用方法;·聚合算法及隨機(jī)森林算法的原理。7.1算法原理決策樹是一個(gè)類似于流程圖的樹結(jié)構(gòu),分支節(jié)點(diǎn)表示對(duì)一個(gè)特征進(jìn)行測(cè)試,根據(jù)測(cè)試結(jié)果進(jìn)行分類,樹葉節(jié)點(diǎn)代表一個(gè)類別。如圖7-1所示,我們用決策樹來決定下班后的安排。圖7-1決策樹我們分別對(duì)精力指數(shù)和情緒指數(shù)兩個(gè)特征進(jìn)行測(cè)試,并根據(jù)測(cè)試結(jié)果決定行為的類別。每選擇一個(gè)特征進(jìn)行測(cè)試,數(shù)據(jù)集就被劃分成多個(gè)子數(shù)據(jù)集。接著繼續(xù)在子數(shù)據(jù)集上選擇特征,并進(jìn)行數(shù)據(jù)集劃分,直到創(chuàng)建出一個(gè)完整的決策樹。創(chuàng)建好決策樹模型后,只要根據(jù)下班后的精力和情緒情況,從根節(jié)點(diǎn)一路往下即可預(yù)測(cè)出下班后的行為。問題來了,在創(chuàng)建決策樹的過程中,要先對(duì)哪個(gè)特征進(jìn)行分裂?比如針對(duì)圖7-1中的例子,先判斷精力指數(shù)進(jìn)行分裂還是先判斷情緒指數(shù)進(jìn)行分裂?要回答這個(gè)問題,我們需要從信息的量化談起。7.1.1信息增益我們天天在談?wù)撔畔?,那么信息要怎么樣來量化呢?948年,香農(nóng)在他著名的《通信的數(shù)學(xué)原理》中提出了信息熵(Entropy)的概念,從而解決了信息的量化問題。香農(nóng)認(rèn)為,一條信息的信息量和它的不確定性有直接關(guān)系。一個(gè)問題不確定性越大,要搞清楚這個(gè)問題,需要了解的信息就越多,其信息熵就越大。信息熵的計(jì)算公式為:其中,P(x)表示事件x出現(xiàn)的概率。例如,一個(gè)盒子里分別有5個(gè)白球和5個(gè)紅球,隨機(jī)取出一個(gè)球。問:這個(gè)球是紅色的還是白色的?這個(gè)問題的信息量多大呢?由于紅球和白球出現(xiàn)的概率都是1/2,代入信息熵公式,可以得到其信息熵為:即,這個(gè)問題的信息量是1bit。對(duì),你沒有看錯(cuò),信息量的單位就是比特。我們要確定這個(gè)球是紅色的還是白色的,只需要1比特的信息就夠了。再舉一個(gè)極端的例子,一個(gè)盒子里有10個(gè)白球,隨機(jī)取出一個(gè)球,這個(gè)球是什么顏色的?這個(gè)問題的信息量是多少呢?答案是0,因?yàn)檫@是一個(gè)確定的事件,其概率P(x)=1,我們代入香農(nóng)的信息熵公式,即可得到其信息熵為0。即,我們不需要再獲取任何新的信息,即可知道這個(gè)球一定是白色的?;氐?jīng)Q策樹的構(gòu)建問題上,當(dāng)我們要構(gòu)建一個(gè)決策樹時(shí),應(yīng)該優(yōu)先選擇哪個(gè)特征來劃分?jǐn)?shù)據(jù)集呢?答案是:遍歷所有的特征,分別計(jì)算,使用這個(gè)特征劃分?jǐn)?shù)據(jù)集前后信息熵的變化值,然后選擇信息熵變化幅度最大的那個(gè)特征,來優(yōu)先作為數(shù)據(jù)集劃分依據(jù)。即選擇信息增益最大的特征作為分裂節(jié)點(diǎn)。比如,一個(gè)盒子里共有紅、白、黑、藍(lán)4種顏色的球共16個(gè),其中紅球2個(gè),白球2個(gè),黑球4個(gè),藍(lán)球8個(gè)。紅球和黑球的體積一樣,都為1個(gè)單位;白球和藍(lán)球的體積一樣,都為2個(gè)單位。紅球、白球和黑球的質(zhì)量一樣,都是1個(gè)單位,藍(lán)球的質(zhì)量為2個(gè)單位。我們應(yīng)該優(yōu)先選擇體積這個(gè)特征,還是優(yōu)先選擇質(zhì)量這個(gè)特征來作為數(shù)據(jù)集劃分依據(jù)呢?根據(jù)前面介紹的結(jié)論,我們先計(jì)算基礎(chǔ)信息熵,即劃分?jǐn)?shù)據(jù)集前的信息熵。從已知信息容易知道,紅球、白球、黑球、藍(lán)球出現(xiàn)的概率分別為2/16,、2/16、4/16、8/16,因此基礎(chǔ)信息熵為:接著使用體積來劃分?jǐn)?shù)據(jù)集,此時(shí)會(huì)劃分出兩個(gè)數(shù)據(jù)集,第一個(gè)子數(shù)據(jù)集里是紅球和黑球,第二個(gè)子數(shù)據(jù)集里是白球和藍(lán)球,我們計(jì)算這種劃分方式的信息熵。其中第一個(gè)子數(shù)據(jù)集里,紅球2個(gè),黑球4個(gè),其概率分別為2/6和4/6,因此第一個(gè)子數(shù)據(jù)集的信息熵為:第二個(gè)子數(shù)據(jù)集里,白球2個(gè),藍(lán)球8個(gè),其概率分別為2/10和8/10,因此第二個(gè)子數(shù)據(jù)集的信息熵為:因此,使用體積來劃分?jǐn)?shù)據(jù)集后,其信息熵為H(D1)=H(D1sub1)+H(D1sub2)=1.640224,其信息增益為H(Dbase)-H(D1)=1.75-1.640224=0.109776,如圖7-2a所示。圖7-2信息增益如果我們使用質(zhì)量來劃分?jǐn)?shù)據(jù)集,也會(huì)劃分出兩個(gè)數(shù)據(jù)集,第一個(gè)子數(shù)據(jù)集里是紅球、白球和黑球,第二個(gè)子數(shù)據(jù)集里是只有藍(lán)球。我們計(jì)算這種劃分方式的信息熵。針對(duì)第一個(gè)子數(shù)據(jù)集,紅球、白球和黑球出現(xiàn)的概率分別是2/8,、2/8、4/8,其信息熵為:第二個(gè)子數(shù)據(jù)集里只有藍(lán)球,其概率為1,因此其信息熵H(D2sub2)=0。我們得出使用使用質(zhì)量來劃分?jǐn)?shù)據(jù)集時(shí)的信息熵為1.5,其信息增益為1.75-1.5=0.25。如圖7-2b所示。由于使用質(zhì)量劃分?jǐn)?shù)據(jù)集比使用體積劃分?jǐn)?shù)據(jù)集得到了更高的信息增益,所以我們優(yōu)先選擇質(zhì)量這個(gè)特征來劃分?jǐn)?shù)據(jù)集。下面來討論信息增益的物理意義。我們以概率P(x)為橫坐標(biāo),以信息熵Entropy為縱坐標(biāo),把信息熵和概率的函數(shù)關(guān)系Entropy=-P(x)log2P(x)在二維坐標(biāo)軸上畫出來,如圖7-3所示。圖7-3信息熵與概率從這個(gè)函數(shù)關(guān)系可以看出來,當(dāng)概率P(x)越接近0或越接近1時(shí),信息熵的值越小,其不確定性越小,即數(shù)據(jù)越“純”。典型地,當(dāng)概率值為1時(shí),此時(shí)數(shù)據(jù)是最“純凈”的,因?yàn)橹挥幸环N類別的數(shù)據(jù),已經(jīng)消除了不確定性,其信息熵為0。我們?cè)谔卣鬟x擇時(shí),選擇信息增益最大的特征,在物理上,即讓數(shù)據(jù)盡量往更純凈的方向上變換。因此,我們得出,信息增益是用來衡量數(shù)據(jù)變得更有序、更純凈的程度的指標(biāo)。熵是熱力學(xué)中表征物質(zhì)狀態(tài)的參量之一,其物理意義是體系混亂程度的度量,被香農(nóng)借用過來,作為信息量的度量。著名的熵增原理是這樣描述的:熵增原理就是孤立熱力學(xué)系統(tǒng)的熵不減少,總是增大或者不變。一個(gè)孤立系統(tǒng)不可能朝低熵的狀態(tài)發(fā)展,即不會(huì)變得有序。用白話講就是,如果沒有外力的作用,這個(gè)世界將是越來越無序的。人活著,在于盡量讓熵變低,即讓世界變得更有序,降低不確定性。當(dāng)我們?cè)谙M(fèi)資源時(shí),是一個(gè)增熵的過程。我們把有序的食物變成了無序的垃圾。例如,筆者在寫書或讀者在看書的過程,可以理解為減熵過程。我們通過寫作和閱讀,減少了不確定的信息,從而實(shí)現(xiàn)了減熵的過程。人生價(jià)值的實(shí)現(xiàn),在于消費(fèi)資源(增熵過程)來獲取能量,經(jīng)過自己的勞動(dòng)付出(減熵過程),讓世界變得更加純凈有序,信息增益(減熵量-增熵量)即是衡量人生價(jià)值的尺度。希望筆者在暮年之時(shí),回首往事,能自信地說,我給這個(gè)世界帶來的信息增益是正數(shù),且已經(jīng)盡力做到最大了。7.1.2決策樹的創(chuàng)建決策樹的構(gòu)建過程,就是從訓(xùn)練數(shù)據(jù)集中歸納出一組分類規(guī)則,使它與訓(xùn)練數(shù)據(jù)矛盾較小的同時(shí)具有較強(qiáng)的泛化能力。有了信息增益來量化地選擇數(shù)據(jù)集的劃分特征,使決策樹的創(chuàng)建過程變得容易了。決策樹的創(chuàng)建基本上分以下幾步。(1)計(jì)算數(shù)據(jù)集劃分前的信息熵。(2)遍歷所有未作為劃分條件的特征,分別計(jì)算根據(jù)每個(gè)特征劃分?jǐn)?shù)據(jù)集后的信息熵。(3)選擇信息增益最大的特征,并使用這個(gè)特征作為數(shù)據(jù)劃分節(jié)點(diǎn)來劃分?jǐn)?shù)據(jù)。(4)遞歸地處理被劃分后的所有子數(shù)據(jù)集,從未被選擇的特征里繼續(xù)選擇最優(yōu)數(shù)據(jù)劃分特征來劃分子數(shù)據(jù)集。問題來了,遞歸過程什么時(shí)候結(jié)束呢?一般來講,有兩個(gè)終止條件,一是所有的特征都用完了,即沒有新的特征可以用來進(jìn)一步劃分?jǐn)?shù)據(jù)集。二是劃分后的信息增益足夠小了,這個(gè)時(shí)候就可以停止遞歸劃分了。針對(duì)這個(gè)停止條件,需要事先選擇信息增益的門限值來作為結(jié)束遞歸的條件。使用信息增益作為特征選擇指標(biāo)的決策樹構(gòu)建算法,稱為ID3算法。1.離散化細(xì)心的讀者可能會(huì)發(fā)現(xiàn)一個(gè)問題:如果一個(gè)特征是連續(xù)值怎么辦呢?我們以本章開頭的圖7-1為例,假設(shè)我們有個(gè)精力測(cè)試儀器,測(cè)出來的是一個(gè)0~100的數(shù)字,這是個(gè)連續(xù)值,這個(gè)時(shí)候怎么用決策樹來建模呢?答案是:離散化。我們需要對(duì)數(shù)據(jù)進(jìn)行離散化處理。例如,當(dāng)精力指數(shù)小于等于40時(shí)標(biāo)識(shí)為低,當(dāng)大于40且小于等于70時(shí)標(biāo)識(shí)為中,當(dāng)大于70時(shí)標(biāo)識(shí)為高。經(jīng)過離散處理后,就可以用來構(gòu)建決策樹了。要離散化成幾個(gè)類別,這個(gè)往往和具體的業(yè)務(wù)相關(guān)。2.正則項(xiàng)最大化信息增益來選擇特征,在決策樹的構(gòu)建過程中,容易造成優(yōu)先選擇類別最多的特征來進(jìn)行分類。舉一個(gè)極端的例子,我們把某個(gè)產(chǎn)品的唯一標(biāo)識(shí)符ID作為特征之一加入到數(shù)據(jù)集中,那么構(gòu)建決策樹時(shí),就會(huì)優(yōu)先選擇產(chǎn)品ID來作為劃分特征,因?yàn)檫@樣劃分出來的數(shù)據(jù),每個(gè)葉子節(jié)點(diǎn)只有一個(gè)樣本,劃分后的子數(shù)據(jù)集最“純凈”,其信息增益最大。這不是我們希望看到的結(jié)果。解決辦法是,計(jì)算劃分后的子數(shù)據(jù)集的信息熵時(shí),加上一個(gè)與類別個(gè)數(shù)成正比的正則項(xiàng),來作為最后的信息熵。這樣,當(dāng)算法選擇的某個(gè)類別較多的特征,使信息熵較小時(shí),由于受到類別個(gè)數(shù)的正則項(xiàng)懲罰,導(dǎo)致最終的信息熵也比較大。這樣通過合適的參數(shù),可以使算法訓(xùn)練得到某種程度的平衡。另外一個(gè)解決辦法是使用信息增益比來作為特征選擇的標(biāo)準(zhǔn)。具體可參閱本章的擴(kuò)展閱讀。3.基尼不純度我們知道,信息熵是衡量信息不確定性的指標(biāo),實(shí)際上也是衡量信息“純度”的指標(biāo)。除此之外,基尼不純度(Giniimpurity)也是衡量信息不純度的指標(biāo),其計(jì)算公式如下:其中,P(x)是樣本屬于這個(gè)類別的概率。如果所有的樣本都屬于一個(gè)類別,此時(shí)P(x)=1,則Gini(D)=0,即數(shù)據(jù)不純度最低,純度最高。我們以概率P(x)作為橫坐標(biāo),以這個(gè)類別的基尼不純度Gini(D)=P(x)(1-P(x))作為縱坐標(biāo),在坐標(biāo)軸上畫出其函數(shù)關(guān)系,如圖7-4所示。圖7-4基尼不純度從圖中可以看出,其形狀和信息熵的形狀幾乎一樣。CART算法使用基尼不純度來作為特征選擇標(biāo)準(zhǔn),CART也是一種決策樹構(gòu)建算法,具體可參閱擴(kuò)展閱讀部分的內(nèi)容。7.1.3剪枝算法使用決策樹模型擬合數(shù)據(jù)時(shí),容易造成過擬合。解決過擬合的方法是對(duì)決策樹進(jìn)行剪枝處理。決策樹的剪枝有兩種思路:前剪枝(Pre-Pruning)和后剪枝(Post-Pruning)。1.前剪枝前剪枝是在構(gòu)造決策樹的同時(shí)進(jìn)行剪枝。在決策樹的構(gòu)建過程中,如果無法進(jìn)一步降低信息熵的情況下,就會(huì)停止創(chuàng)建分支。為了避免過擬合,可以設(shè)定一個(gè)閾值,信息熵減小的數(shù)量小于這個(gè)閾值,即使還可以繼續(xù)降低熵,也停止繼續(xù)創(chuàng)建分支。這種方法稱為前剪枝。還有一些簡(jiǎn)單的前剪枝方法,如限制葉子節(jié)點(diǎn)的樣本個(gè)數(shù),當(dāng)樣本個(gè)數(shù)小于一定的閾值時(shí),即不再繼續(xù)創(chuàng)建分支。2.后剪枝后剪枝是指決策樹構(gòu)造完成后進(jìn)行剪枝。剪枝的過程是對(duì)擁有同樣父節(jié)點(diǎn)的一組節(jié)點(diǎn)進(jìn)行檢查,判斷如果將其合并,信息熵的增加量是否小于某一閾值。如果小于閾值,則這一組節(jié)點(diǎn)可以合并一個(gè)節(jié)點(diǎn)。后剪枝是目前較普遍的做法。后剪枝的過程是刪除一些子樹,然后用子樹的根節(jié)點(diǎn)代替,來作為新的葉子節(jié)點(diǎn)。這個(gè)新葉子節(jié)點(diǎn)所標(biāo)識(shí)的類別通過大多數(shù)原則來確定,即把這個(gè)葉子節(jié)點(diǎn)里樣本最多的類別,作為這個(gè)葉子節(jié)點(diǎn)的類別。后剪枝算法有很多種,其中常用的一種稱為降低錯(cuò)誤率剪枝法(Reduced-ErrorPruning)。其思路是,自底向上,從已經(jīng)構(gòu)建好的完全決策樹中找出一個(gè)子樹,然后用子樹的根節(jié)點(diǎn)代替這棵子樹,作為新的葉子節(jié)點(diǎn)。葉子節(jié)點(diǎn)所標(biāo)識(shí)的類別通過大多數(shù)原則來確定。這樣就構(gòu)建出一個(gè)新的簡(jiǎn)化版的決策樹。然后使用交叉驗(yàn)證數(shù)據(jù)集來測(cè)試簡(jiǎn)化版本的決策樹,看看其錯(cuò)誤率是不是降低了。如果錯(cuò)誤率降低了,則可以使用這個(gè)簡(jiǎn)化版的決策樹代替完全決策樹,否則還是采用原來的決策樹。通過遍歷所有的子樹,直到針對(duì)交叉驗(yàn)證數(shù)據(jù)集,無法進(jìn)一步降低錯(cuò)誤率為止。對(duì)其他剪枝算法感興趣的讀者,可以搜索decisiontreepruning來獲取更多信息。7.2算法參數(shù)scikit-learn使用sklearn.tree.DecisionTreeClassifier類來實(shí)現(xiàn)決策樹分類算法。其中幾個(gè)典型的參數(shù)解釋如下?!riterion:特征選擇算法。一種是基于信息熵,另外一種是基于基尼不純度。有研究表明,這兩種算法的差異性不大,對(duì)模型的準(zhǔn)確性沒有太大的影響。相對(duì)而言,信息熵運(yùn)算效率會(huì)低一些,因?yàn)樗袑?duì)數(shù)運(yùn)算。更詳細(xì)的信息,可通過搜索decisiontreeginivs.entropy獲取?!plitter:創(chuàng)建決策樹分支的選項(xiàng),一種是選擇最優(yōu)的分支創(chuàng)建原則,另外一種是從排名靠前的特征中,隨機(jī)選擇一個(gè)特征來創(chuàng)建分支,這個(gè)方法和正則項(xiàng)的效果類似,可以避免過擬合問題。·max_depth:指定決策樹的最大深度。通過指定該參數(shù),用來解決模型過擬合問題?!in_samples_split:這個(gè)參數(shù)指定能創(chuàng)建分支的數(shù)據(jù)集的大小,默認(rèn)是2。如果一個(gè)節(jié)點(diǎn)的數(shù)據(jù)樣本個(gè)數(shù)小于這個(gè)數(shù)值,則不再創(chuàng)建分支。這也是一種前剪枝的方法?!in_samples_leaf:創(chuàng)建分支后的節(jié)點(diǎn)樣本數(shù)量必須大于等于這個(gè)數(shù)值,否則不再創(chuàng)建分支。這也是一種前剪枝的方法?!ax_leaf_nodes:除了限制最小的樣本節(jié)點(diǎn)個(gè)數(shù),該參數(shù)可以限制最大的樣本節(jié)點(diǎn)個(gè)數(shù)?!in_impurity_split:可以使用該參數(shù)來指定信息增益的閾值。決策樹在創(chuàng)建分支時(shí),信息增益必須大于這個(gè)閾值,否則不創(chuàng)建分支。從這些參數(shù)可以看到,scikit-learn有一系列的參數(shù)用來控制決策樹生成的過程,從而解決過擬合問題。其他參數(shù)請(qǐng)參閱scikit-learn官方文檔。7.3實(shí)例:預(yù)測(cè)泰坦尼克號(hào)幸存者眾所周知,泰坦尼克號(hào)是歷史上最嚴(yán)重的一起海難事故的主角。我們通過決策樹模型,來預(yù)測(cè)哪些人可能成為幸存者。數(shù)據(jù)集來自\h/c/titanic。筆者已經(jīng)下載下來,并放在隨書代碼datasets/titanic目錄下。數(shù)據(jù)集中總共有兩個(gè)文件,都是csv格式的數(shù)據(jù)。其中,train.csv是訓(xùn)練數(shù)據(jù)集,包含已標(biāo)注的訓(xùn)練樣本數(shù)據(jù)。test.csv是我們的模型要進(jìn)行幸存者預(yù)測(cè)的數(shù)據(jù)。我們的任務(wù)就是根據(jù)train.csv里的數(shù)據(jù)訓(xùn)練模型來,然后使用這個(gè)模型來預(yù)測(cè)test.csv里的數(shù)據(jù),最后把預(yù)測(cè)結(jié)果提交到上。7.3.1數(shù)據(jù)分析train.csv是一個(gè)892行、12列的數(shù)據(jù)表格。意味著我們有891個(gè)訓(xùn)練樣本(扣除表頭),每個(gè)樣本有12個(gè)特征,我們需要先分析這些特征,以便決定哪個(gè)特征可以用來進(jìn)行模型訓(xùn)練。·PassengerId:乘客的ID號(hào),這是個(gè)順序編號(hào),用來唯一地標(biāo)識(shí)一名乘客。這個(gè)特征和幸存與否無關(guān),我們不使用這個(gè)特征?!urvived:1表示幸存,0表示遇難。這個(gè)是我們的標(biāo)注數(shù)據(jù)?!class:倉位等級(jí),是很重要的特征??催^電影的讀者都知道,高倉位等級(jí)的乘客能更快地到達(dá)甲板,從而更容易獲救?!ame:乘客名字,這個(gè)特征和幸存與否無關(guān),我們會(huì)丟棄這個(gè)特征?!ex:乘客性別,看過電影的讀者都知道,由于救生艇數(shù)量不夠,船長讓婦女和兒童先上救生艇。所以這也是個(gè)很重要的特征。·Age:乘客性別,兒童會(huì)優(yōu)先上救生艇,身強(qiáng)力壯者幸存概率也會(huì)高一些?!ibSp:兄弟姐妹同在船上的數(shù)量。·Parch:同船的父輩人員數(shù)量?!icket:乘客票號(hào)。我們不使用這個(gè)特征。·Fare:乘客的體熱指標(biāo)。·Cabin:乘客所在的船艙號(hào)。實(shí)際上這個(gè)特征和幸存與否有一定的關(guān)系,比如最早被水淹沒的船艙位置,其乘客的幸存概率要低一些。但由于這個(gè)特征有大量的丟失數(shù)據(jù),而且沒有更多的數(shù)據(jù)來對(duì)船艙進(jìn)行歸類,因此我們丟棄這個(gè)特征的數(shù)據(jù)。·Embarked:乘客登船的港口。我們需要把港口數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù)。我們需要加載csv數(shù)據(jù),并做一些預(yù)處理,包括:·提取Survived列的數(shù)據(jù)作為模型的標(biāo)注數(shù)據(jù)?!G棄不需要的特征數(shù)據(jù)?!?duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,以便模型處理。比如性別數(shù)據(jù),我們需要轉(zhuǎn)換為0和1?!ぬ幚砣笔?shù)據(jù)。比如年齡這個(gè)特征,有很多缺失的數(shù)據(jù)。pandas是完成這些任務(wù)的理想軟件包。我們先把數(shù)據(jù)從文件里讀取出來:importpandasaspd
defread_dataset(fname):
#指定第一列作為行索引
data=pd.read_csv(fname,index_col=0)
#丟棄無用的數(shù)據(jù)
data.drop(['Name','Ticket','Cabin'],axis=1,inplace=True)
#處理性別數(shù)據(jù)
data['Sex']=(data['Sex']=='male').astype('int')
#處理登船港口數(shù)據(jù)
labels=data['Embarked'].unique().tolist()
data['Embarked']=data['Embarked'].apply(lambdan:labels.index(n))
#處理缺失數(shù)據(jù)
data=data.fillna(0)
returndata
train
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025廣西防城港市港口區(qū)人民檢察院招聘檢務(wù)輔助人員2人備考題庫及答案詳解1套
- 2025北京外企(江西)人力資源服務(wù)有限公司宜春分公司招聘?jìng)淇碱}庫及一套答案詳解
- 2025西藏自治區(qū)醫(yī)院(四川大學(xué)華西醫(yī)院西藏醫(yī)院)第三批招聘25人備考題庫及一套參考答案詳解
- 2025陜西漢中市鐵路中心醫(yī)院招聘醫(yī)學(xué)檢驗(yàn)技師2人備考題庫及答案詳解參考
- 2026中交集團(tuán)紀(jì)委第一辦案中心社會(huì)招聘5人備考題庫及完整答案詳解
- 2025新疆農(nóng)發(fā)集團(tuán)肥業(yè)有限公司招聘3人備考題庫及1套完整答案詳解
- 2026年甘肅省臨夏七醫(yī)院社會(huì)招聘63人備考題庫及答案詳解(新)
- 2025安徽省中石化蕪湖石油分公司招聘?jìng)淇碱}庫及答案詳解(奪冠系列)
- 2025貴州磷化集團(tuán)社招45人備考題庫及完整答案詳解一套
- 2025江西省中贛投勘察設(shè)計(jì)有限公司招聘6人備考題庫有答案詳解
- 【語文】湖南省長沙市實(shí)驗(yàn)小學(xué)小學(xué)四年級(jí)上冊(cè)期末試卷(含答案)
- 阿米巴經(jīng)營模式-人人都是經(jīng)營者推行授課講義課件
- 小兒鞘膜積液
- 畢業(yè)設(shè)計(jì)粘土心墻土石壩設(shè)計(jì)含計(jì)算書cad圖
- 黑龍江省控制性詳細(xì)規(guī)劃編制規(guī)范
- 6工程竣工驗(yàn)收交付證明書
- 《俠客風(fēng)云傳前傳》支線流程攻略1.0.2.4
- GB/T 38937-2020鋼筋混凝土用鋼術(shù)語
- GB/T 12325-2008電能質(zhì)量供電電壓偏差
- 《抖音短視頻營銷存在的問題及對(duì)策10000字》
- 讀后續(xù)寫練習(xí)指導(dǎo) 講義(附試題分析及范文3篇)-2023高考英語二輪復(fù)習(xí)寫作備考
評(píng)論
0/150
提交評(píng)論