《數據倉庫與數據挖掘》課件 第7-9章 報表開發與設計、線性回歸與邏輯回歸、決策樹與隨機森林_第1頁
《數據倉庫與數據挖掘》課件 第7-9章 報表開發與設計、線性回歸與邏輯回歸、決策樹與隨機森林_第2頁
《數據倉庫與數據挖掘》課件 第7-9章 報表開發與設計、線性回歸與邏輯回歸、決策樹與隨機森林_第3頁
《數據倉庫與數據挖掘》課件 第7-9章 報表開發與設計、線性回歸與邏輯回歸、決策樹與隨機森林_第4頁
《數據倉庫與數據挖掘》課件 第7-9章 報表開發與設計、線性回歸與邏輯回歸、決策樹與隨機森林_第5頁
已閱讀5頁,還剩108頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章

報表開發與設計目錄7.1什么是報表

7.2帆軟產品簡介

7.3開發環境準備

7.4快速開發一個報表7.5課后習題

7.1

什么是報表7.1什么是報表報表,作為現代企業信息管理的重要組成部分,不僅以表格、圖表等直觀形式動態展示數據,還承載著數據深度挖掘與可視化呈現的重任。類別:(1)表格報表(2)圖表報表(3)儀表盤報表(4)地圖報表(5)交叉表/透視表(6)地圖報表(7)熱力圖7.2

報表開發工具簡介7.2報表開發工具簡介FineReport是一款專為報表制作、深度分析及高效展示而設計的強大工具,它賦能用戶以輕松之姿構建出高度靈活且功能全面的數據分析與報表系統。通過運用FineReport,企業能夠顯著縮短項目開發與實施的周期,有效控制并降低相關成本,進而從根本上解決企業內部信息孤島的問題,確保數據資源得以充分挖掘并發揮其應有的價值,驅動企業決策更加精準高效。7.2.1報表開發工具基本功能結構7.3

開發環境準備7.3開發環境準備準備開發環境的具體流程:7.4

快速開發一個報表7.4快速開發一個報表報表設計主要可以分為新建報表、數據準備、報表主體設計、報表預覽幾大部分。其中報表主體可以分為大標題、小標題、表格數據、結尾幾大部分,本小節主要以普通報表為例,講述如何按照報表設計流程快速設計一張報表。開發效果:7.5

課后習題7.5課后習題1.請簡述報表的基本概念及其在企業信息管理中的作用。2.請列舉報表的幾種類型,并說明每種報表的特點和適用場景。3.請描述帆軟產品FineReport的基本功能和特點。4.請解釋報表系統的數據層、應用層和展示層的功能和作用。5.請簡述FineReport在企業信息化過程中的作用。6.請描述開發報表系統的流程,包括數據連接、數據準備、報表主體設計等步驟。7.請舉例說明如何使用FineReport設計一張普通報表,包括數據連接、數據準備、報表主體設計等步驟。第8章

線性回歸與邏輯回歸本章主要內容8.1線性回歸8.2邏輯回歸8.3課后習題8.1線性回歸數據數據挖掘有價值的知識和信息(如預測發展趨勢)數據數據統計統計信息(如環比、同比等)8.1.1線性回歸原理——數據挖掘8.1.1線性回歸原理——預測數值高爾頓研究父母和孩子身高關系父母和孩子的身高呈現“回歸現象”回歸算法主要用于“預測數值”假設挖掘模型為y=f(x)表達式為

y=ax+b8.1.1線性回歸原理——簡單舉例歷史數據x=10時y=100x=20時y=150訓練出a=5\b=50即該模型在該場景應表示為y=5x+50待挖掘數據x=8時預測y=?x=8時預測y=90將歷史數據代入模型:10a+b=10020a+b=1508.1.1線性回歸原理假設有數據挖掘模型y=f(x)數學表達式為y=ax+b歷史數據:當x=1.8時y=4.8

當x=4時y=8.2

當x=8時y=15.2

當x=8.3時y=14.8

當x=9.8時y=17.5......預測:當x=11.4時y=?數據點雖然無法真正用一條線來表示,但是y和x依然趨近于“一次關系”,這時就可以考慮使用“線性回歸”8.1.1線性回歸原理——多元線性回歸序號屬性1(x1)屬性2(x2)屬性3(x3)……屬性500(x500)目標屬性(y)181001050……705100502102002000……800210003153002800……1200280004780800……7009500581001050……800100506450500……3535000..........................................70017100350……700?假設模型表達式是:y=a1x1+a2x2+a3x3+……+a500x500+b歷史數據如下求:第7001個數據中目標屬性的取值?8.1.1線性回歸原理——多元線性回歸假設模型表達式是:y=f(x1,x2,x3...xn)

即:y=a1x1+a2x2+a3x3+……+anxn+b

將a1、a2、a3......an轉換成w1、w2、w3......wn

將b轉換為w0

原公式變為:y=f(x1,x2,x3...xn)

即:y=w1x1+w2x2+w3x3+……+wnxn+w0引入向量表示法設向量:x=(x0=1,x1,x2,x3...xn)w=(w0,w1,w2,w3...wn)將x和w代入y=f(x1,x2,x3...xn)則有多元線性回歸表達:y=f(x)=wx其中w又被稱為參數向量,多元線性回歸模型訓練的目標就是求w8.1.2損失函數與損失函數的解法訓練模型的中心思想是讓模型預測值與真實值之間的差距盡量小。

可以將這個差距表達為:,其中y是真實值,

是預測值

模型的最終任務是讓y和更加接近。

假設一共有m個樣本,下標i是樣本編號,這m個樣本的預測誤差值之和是

考慮到誤差正負號可能存在抵消,衡量標準改為m個樣本的誤差平方和

代入上面公式,則多元線性回歸的損失函數為

8.1.2損失函數與損失函數的解法求損失函數最小值在訓練模型時yi和xi都是歷史數據的一部分,所以此時的目標就是求解J最小時w的取值,進而確定整個模型的參數。方法一:

求導法方法二:

梯度下降法8.1.2損失函數與損失函數的解法——求導法求導法涉及大量的矩陣運算,為了簡便,損失函數書寫方式調整為其中y是所有樣本真實值組成的向量,w是特征參數組成的向量,X是所有樣本數據組成的矩陣。推導f最小時w取值的步驟如下:求極值時導數為0注意:矩陣可逆的一個前提條件是矩陣要滿秩(感興趣的同事可以研究“矩陣的秩”和“多重共線性”問題)8.1.2損失函數與損失函數的解法——梯度下降法有沒有求損失函數最小值時不受“前提條件”限制的方法呢?——有,梯度下降法。梯度下降法就是在求函數極值(如最小值)時,通過試探的方法,一步一步找到最小值。以一元函數y=f(x)為例,它的函數圖像如右圖所示。首先給函數一個x1,得到函數值f(x1),然后在x1處對f(x)求導,沿f(x)值向下方向選取x2,得到f(x2),比較f(x2)和f(x1),可以看到確實達到了函數值“下降”效果。然后再延f(x)在x2處導數向下方向繼續尋找x3,以此類推,最終找到最小值。當f(xn)最小時,xn就是函數的極值點。8.1.2損失函數與損失函數的解法——梯度下降法如果是多元函數會是什么樣呢?例如J是以w1和w2為變量的多元函數,它的梯度下降求解極值過程如右圖所示。對于二元函數f來說,它尋找下降方向(也就是求導)時是針對w1和w2分別求偏導,然后沿著兩個變量的方向尋找下一個取值點。當找到最小值時,對應的w1和w2就是函數的極值點。

對于更多元函數來說,已經無法用圖像表示梯度下降過程了,但是思路都是一樣的,沿著每個變量的下降方向探索。所以對于多元線性回歸的損失函數,就是針對w1、w2......wn等變量求偏導,然后沿著它們分別的下降方向探索極值點。8.1.3正則化與過擬合——過擬合問題無論是導數法還是梯度下降法,在求出參數向量w后,模型參數確定,模型訓練完畢!!!然而,萬事大吉了嗎?——需要注意過擬合問題。什么是過擬合?一個學生在備考的時候會做大量的練習題,但是如果考生只會做練習過的題,考試時出現新題就不會了,這就屬于過擬合。在機器學習中,如果模型參數求解過程過分依賴訓練數據集,就會出現“模型在訓練集上表現很好,但在測試集上表現糟糕”的問題,這就是過擬合。避免過擬合穿上馬甲我照樣認識你8.1.3正則化與過擬合——多元線性回歸與過擬合數據挖掘中,過擬合問題并不一定會出現,但“不得不防”。多元線性回歸的數學表達式為:y=f(x)=wx+b。這個表達式中參數向量w主要與訓練數據集x相關,所以不得不考慮出現過擬合的問題。如果多元線性回歸出現了過擬合問題。可以使用以下兩種思路解決

方法一:擴大訓練集

方法二:使用正則化8.1.3正則化與過擬合——正則化線性回歸中的正則化思想:在原始損失函數中,增加由參數向量組成,但與參數向量無關的“懲罰項”。常用兩種正則化方式:

L1正則化(lasso回歸)L2正則化(嶺回歸)由于懲罰項的存在,損失函數在求解極值時,w向量需要被考慮兩次,懲罰項部分與訓練集數據完全沒有關系,所以緩解了函數過分依賴于訓練集數據。8.1.3正則化與過擬合——正則化(L1和L2的區別)(1)L1正則化(lasso回歸)的w參數向量中可能會有0,但L2正則化(嶺回歸)的參數向量不會出現0;(2)L2正則化(嶺回歸)可以避免多重共線性,但L1正則化(Lasso回歸)沒有此功能;L2正則化后,此時對w進行求導取0后變成了如下形式:

其中

肯定可逆,所以w肯定有解(3)Lasso回歸是一次運算,因此模型計算速度比嶺回歸快。一些說明數據表中的列經常被稱為:屬性、特征、維、列等歷史數據一般分為訓練集和測試集,訓練集就是用于訓練模型的數據,測試集是為了檢測模型的效果建模的步驟

第零步:與業務部門溝通

第一步:導入數據、探索數據

第二步:進行必要的數據預處理

第三步:建模

第四步:用測試集檢驗模型預測效果8.1.4線性回歸的實現與模型評價——代碼實現(以預測波士頓房價案例為例)#第一步:導入數據#導入numpy和pandas數據包importnumpyasnpimportpandasaspd#從boston_lishi.csv文件中導入原始數據df=pd.read_csv(r'E:\boston_lishi.csv',index_col='id')#X為原始數據中不包括target列部分,是由歷史數據中“非結果列”組成的數據X=df.loc[:,(df.columns!='target')]#Y為原始數據中target列部分,是由歷史數據中“結果列”組成的數據Y=df.loc[:,df.columns=='target']8.1.4線性回歸的實現與模型評價——代碼實現(以預測波士頓房價案例為例)#第二步:數據預處理#缺失值處理df.dropna()#數據標準化fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler()X=scaler.fit_transform(X)#其他數據預處理將在第6次課介紹8.1.4線性回歸的實現與模型評價——代碼實現(以預測波士頓房價案例為例)#第三步建模#將歷史數據按照8:2的比例分隨機分為訓練集和測試集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)#從sklearn的linear字庫中導入嶺回歸工具包#如果引入嶺回歸的包importRidge;引入lasso回歸的包importlassofromsklearn.linear_modelimportLinearRegressionasLR#創建模型reg=LR()#訓練模型reg.fit(Xtrain,Ytrain)8.1.4線性回歸的實現與模型評價——模型評價(以預測波士頓房價案例為例)#第四步,用測試集檢驗模型預測效果#使用predict方法,根據Xtest預測測試集的結果result=reg.predict(Xtest)#將測試集真實結果和預測結果進行對比df=pd.DataFrame({'真實結果':Ytest.loc[:,'target'],'預測結果':pd.Series(result.reshape(-1),index=Ytest.index)})print(df)這樣能看出模型表現優良嗎?8.1.4線性回歸的實現與模型評價——模型評價(以預測波士頓房價案例為例)#第四步,用測試集檢驗模型預測效果#可以使用一些指標來評價模型表現,例如使用R2值評價多元線性回歸score=reg.score(Xtest,Ytest)print(score)其中

是所有真實結果的平均值,

是第i個樣本的預測值,

是第i個樣本的預測值在統計學中,方差除了體現了數據之間的波動性之外,還可以體現數據集所攜帶的信息量

如果除以m就是數據集真實的方差,也就是數據集真實的信息量。除以m就是一個類方差數據,是真實值與預測值之間的信息差,也就是模型沒有擬合出來的信息表達的是模型沒有擬合出來的信息量和數據集真實信息量的占比,用1減去它,表達的意思是模型擬合出來的信息量占數據集真實信息量的占比。所以R2越接近1越好。8.1.5重要參數和屬性但是LR()括號內是可以傳遞參數的。線性回歸有哪些重要參數可以設置呢?(1)fit_intercept:內容為布爾型,意思是是否考慮使用截距,如果是False就不考慮截距。(2)normalize:內容為布爾型,意思是是否對數據進行標準化,如果是False就不進行標準化,將在第12章詳細介紹標準化。(3)n_jobs:內容為整數,意思是計算時設置的任務個數,數值越高,任務越多,計算資源占用的越多。8.1.5重要參數和屬性#可以使用coef_屬性,查看線性回歸各個參數的值print(reg.coef_)8.2邏輯回歸邏輯回歸邏輯回歸“真名”叫logisticRegression,雖然也叫“回歸”,但是它確實用于解決預測分類問題。分類問題的預測結果是類別型的(具體的類別叫“標簽”)。例如猜一場足球比賽結果,就是通過各種信息,預測“主隊贏”、“主隊平”、“主隊輸”三個結果,這三個結果就是標簽,預測比賽勝負結果就是典型的分類問題。8.2.1邏輯回歸原理序號屬性1(x1)屬性2(x2)屬性3(x3)……屬性500(x500)目標屬性(y)181001050……70502102002000……80013153002800……120014780800……7001581001050……80006450500……3530..........................................70017100350……700?通過屬性1、屬性2、屬性3......確定目標屬性(0或者1)8.2.1邏輯回歸原理既然邏輯回歸是用于分類問題,那為什么叫回歸呢?——因為它的原理與線性回歸非常像。

邏輯回歸的數據表達式8.2.1邏輯回歸原理那如何確定Θ中的各個特征參數呢?同樣使用損失函數求極值的方法,但這個損失函數更加復雜,且是通過極大似然估計推導出來的。同樣可以使用L1或者L2正則化對損失函數進行改造,改造后的L1或L2正則化如下:這個損失函數的求解過程非常復雜,主要包括隨機梯度下降法、牛頓法等邏輯回歸簡單實現(以乳腺癌預測案例為例)#第一步:導入數據#導入numpy和pandas數據包importnumpyasnpimportpandasaspd#從boston_lishi.csv文件中導入原始數據df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#X為原始數據中不包括target列部分,是由歷史數據中“非結果列”組成的數據X=df.loc[:,(df.columns!='target')]#Y為原始數據中target列部分,是由歷史數據中“結果列”組成的數據Y=df.loc[:,df.columns=='target']邏輯回歸簡單實現(以乳腺癌預測案例為例)

#第二步:數據預處理#缺失值處理df.dropna()#數據標準化fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler()X=scaler.fit_transform(X)#其他數據預處理將在第6次課介紹邏輯回歸簡單實現(以乳腺癌預測案例為例)

第三步建模#將歷史數據按照8:2的比例分隨機分為訓練集和測試集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)#導入邏輯回歸工具包fromsklearn.linear_modelimportLogisticRegressionasLR#創建模型reg=LR()#訓練模型reg.fit(Xtrain,Ytrain)邏輯回歸簡單實現(以乳腺癌預測案例為例)

#第四步,用測試集檢驗模型預測效果#使用predict方法,根據Xtest預測測試集的結果result=reg.predict(Xtest)#將測試集真實結果和預測結果進行對比df=pd.DataFrame({'真實結果':Ytest.loc[:,'target'],'預測結果':pd.Series(result,index=Ytest.index)})print(df)這樣能看出模型表現優良嗎?邏輯回歸簡單實現(以乳腺癌預測案例為例)

#第四步,用測試集檢驗模型預測效果#可以使用一些指標來評價模型表現,例如使用準確率評價邏輯回歸score=reg.score(Xtest,Ytest)print(score)準確率:預測對的樣本數/總樣本數表達的是模型沒有擬合出來的信息量和數據集真實信息量的占比,用1減去它,表達的意思是模型擬合出來的信息量占數據集真實信息量的占比。所以R2越接近1越好。準確率固然是分類模型最重要的衡量指標,但準確率高一定表示模型表現好嗎?假設生活中如下案例:肺癌的發病率約千分之三,假設1000人中有3人是肺癌,模型預測結果為1000人均健康,此時模型的準確率是99.7%,但實際情況是“一個病人沒檢查出來”,這樣的模型是我們想要的嗎?8.2.2邏輯回歸的實現方法與模型評價(混淆矩陣)8.2.2邏輯回歸的實現方法與模型評價——混淆矩陣實現#生成混淆矩陣fromsklearn.metricsimportconfusion_matrixasCMcm=CM(Ytest,result,labels=[0,1])print(cm)#計算recallfromsklearn.metricsimportroc_curveFPR,recall,threshold=roc_curve(Ytest,result,pos_label=1)print(recall)8.2.2邏輯回歸的實現方法與模型評價——AUC值AUC值其實是在畫ROC曲線時的曲線面積(ROC曲線在二分類問題時,可以通過可視化方式直觀看到模型在遇到類不均衡問題時的表現,感興趣的同學可以自行研究),AUC值越大,分類在類不均衡問題中表現越好。AUC值實現#計算AUC值fromsklearn.metricsimportroc_auc_scorearea=roc_auc_score(Ytest,result)print(area)8.2.2邏輯回歸的實現方法與模型評價——AUC值#計算AUC值fromsklearn.metricsimportroc_auc_scorearea=roc_auc_score(Ytest,result)print(area)AUC值,值越大,效果越好8.2.3重要參數和調參方法如果模型的表現不好怎么辦?可以通過調整超參數取值,優化模型表現。所謂超參數就是模型中需要人為設定的參數,例如邏輯回歸L1正則化和L2正則化中的C就是超參數,可以通過改變C值的大小,調整懲罰項在損失函數中的比例,改變模型訓練后Θ的取值,從而改變模型的表現。8.2.3重要參數和調參方法——超參數penalty:內容是字符串,可以是“l1”或者“l2”,意思是使用L1或者L2正則化。solver:內容是字符串,包括“liblinear”、“lbfgs”、“newton-cg”、“sag”,意思是使用哪種方法對損失函數進行極值求解。這幾個選項中“liblinear”是坐標軸下降法、“lbfgs”是牛頓法、“newton-cg”是另一種牛頓法、“sag”是隨機梯度下降。其中坐標軸下降法適用于小數據集,也是默認值,而牛頓法和隨機梯度下降適用于大數據集因為速度更快。max_iter:內容是整數型,意思是當solver選擇牛頓法或者隨機梯度下降法,就會涉及到算法的迭代(思路類似于梯度下降法找到極值點的過程),max_iter就是指定迭代次數,可以避免因迭代次數過多引起模型性能太低。但如果太小可能會無法收斂(找不到損失函數極值),所以一般根據自己設備的性能而定。C:內容是正浮點型數,L1正則化和L2正則化損失函數中的C,C越大,懲罰項重要程度越低。8.2.3重要參數和調參方法——參數選擇學習曲線:例如針對邏輯回歸的參數C,我們可以指定一個取值范圍,然后計算每一個取值時模型的準確率,以C的取值為橫坐標,以每個取值對應的模型準確率為縱坐標,繪制一條曲線,可以看出模型準確率隨C取值的變化及峰值,從而選擇參數取值。8.2.3重要參數和調參方法——交叉驗證例如有1000條歷史數據訓練模型,需要將這1000條數據分成訓練集和測試集。可以采用train_test_split方法按照一定比例隨機選擇訓練接和測試集,雖然具有一定代表性,但不能完全看出模型訓練的水平。這時就可以使用交叉驗證,它相當于將1000條歷史數據分成了10份(又稱10折),第一次用其中1份作測試集,另外9份作訓練集,第二次換1份作測試集,另外9份作訓練集,以此類推,迭代10次,得到10個準確率。這樣訓練集和測試集涵蓋了整個歷史數據集,可以針對這10次的準確率做平均值,求得的準確率更有說服力。8.2.3重要參數和調參方法——交叉驗證+學習曲線的實現#C的取值在0.4到30之間,檢查模型的表現#引入交叉驗證工具包fromsklearn.model_selectionimportcross_val_score#設置列表score,以便承接各個取值后交叉驗證的結果score=[]#C在0.4到30間分別取30個值,檢查模型表現foriinnp.linspace(0.4,30,30):#針對不同取值分別建模reg=LR(penalty='l1',solver='liblinear',C=i,max_iter=100)#針對每次取值的模型進行10折交叉驗證,并對結果取平均值s=cross_val_score(reg,X,Y,cv=10).mean()

#將每次取值模型交叉驗證表現裝入列表score中

score.append(s)8.2.3重要參數和調參方法——交叉驗證+學習曲線的實現(續)#繪制學習曲線importmatplotlib.pyplotaspltplt.plot(np.linspace(0.3,30,30),score,color='blue',label='cross_val_score')plt.legend()plt.show()#顯示最終結果score=np.array(score)print("模型表現最好的準確率:")print(np.max(score))print("模型表現最好時C的取值:")print(np.linspace(0.3,30)[np.argmax(score)])8.3課后習題課后習題1.使用線性回歸模型,重新做一遍波士頓房價預測實例,要求修改random_state數值,并通過train_test_split中的test_size參數將訓練集和測試集比例修改為7:3。2.使用邏輯回歸模型,重新做一遍乳腺癌預測實例,要求修改random_state數值,并通過train_test_split中的test_size參數將訓練集和測試集比例修改為7:3,并使用學習曲線方式對C進行調參。第9章

決策樹與隨機森林本章主要內容9.1決策樹9.2回歸樹9.3隨機森林9.4課后習題9.1決策樹9.1.1決策樹的原理決策樹:用于解決分類問題生活中的例子:母親給女兒介紹一個男朋友,女兒根據各種信息判斷是否同意去相親葉子節點中間節點根節點9.1.2如何建立一棵決策樹思路一:基于信息熵建樹ID3、C4.5CART思路二:基于基尼系數建樹9.1.2如何建立一棵決策樹——信息熵信息熵是用來衡量一個隨機變量出現的期望值。信息的不確定性越大,熵的值也就越大,出現的各種情況也就越多。例如“下一屆國際足聯男子世界杯冠軍”這個句話的信息熵就大于“下一屆國際乒聯男子世界杯冠軍”,因為前者在事件沒有發生時的不確定性很高,冠軍可能的情況包括法國隊、巴西隊、阿根廷隊、德國隊、英格蘭隊、意大利隊......,而后者在事件沒有發生時的不確定性很低,冠軍可能的情況只有中國隊。信息熵的計算公式為:

,其中X是所有發生的可能性,x是某一種可能性。以“2022年國際足聯男子世界杯冠軍”這個事件為例,假設共有8支隊伍有可能奪冠,每支隊伍奪冠的可能性都是1/8。則“2022年國際足聯男子世界杯冠軍”這件事的信息熵為:決策樹的兩種子方法ID3和C4.5就是使用信息熵作為建樹的理論依據。9.1.2如何建立一棵決策樹——ID3建樹過程

ID3使用了基于信息熵計算的信息增益方法,信息增益公式為:

其中Gain(X)表示某一個特征的信息增益,ci表示第i中分類,xi表示某一特征的第i種數值步驟1:info(c)部分計算,即針對標簽(是否買電腦)的信息熵計算:買電腦的樣本為9,即買電腦的概率是9/14,不買電腦的概率是5/14。因此:info(c)=-9/14log2(9/14)-5/14log2(5/14)≈0.9409.1.2如何建立一棵決策樹——ID3建樹過程

ID3使用了基于信息熵計算的信息增益方法,信息增益公式為:

其中Gain(X)表示某一個特征的信息增益,ci表示第i中分類,xi表示某一特征的第i種數值步驟2:info(c|年齡)的計算,即針對年齡特征和標簽的條件信息熵的計算:在年齡特征,一共分為三種情況:<30、30-40、>40

情況1:當年齡<30時,一共有5個樣本,其中2個買電腦了,3個沒買,即info(c|x<30)=-2/5log2(2/5)-3/5log2(3/5)

情況2:當30<=年齡<=40時,一共有4個樣本,其中3個買電腦了,1個沒買,即info(c|30<=x<=30)=-3/4log2(3/4)-1/4log2(1/4)情況3:當年齡>40時,一共有5個樣本,其中3個買電腦了,2個沒買,即info(c|x>40)=-3/5log2(3/5)-2/5log2(2/5)9.1.2如何建立一棵決策樹——ID3建樹過程

ID3使用了基于信息熵計算的信息增益方法,信息增益公式為:

其中Gain(X)表示某一個特征的信息增益,ci表示第i中分類,xi表示某一特征的第i種數值步驟3:計算Gain(年齡)Gain(年齡)=

info(c)

-5/14*info(c|x<30)

-4/14*info(c|30<=x<=40)

-5/14*info(c|x>40)

≈0.1509.1.2如何建立一棵決策樹——ID3建樹過程

ID3使用了基于信息熵計算的信息增益方法,信息增益公式為:

其中Gain(X)表示某一個特征的信息增益,ci表示第i中分類,xi表示某一特征的第i種數值步驟4:根據前三步計算方法,分別計算出:

Gain(年齡)

≈0.150

Gain(收入)

≈0.090

Gain(學生)

≈0.016

Gain(信用)

≈0.048其中“年齡”的信息增益是最大的9.1.2如何建立一棵決策樹——ID3建樹過程

ID3使用了基于信息熵計算的信息增益方法,信息增益公式為:

其中Gain(X)表示某一個特征的信息增益,ci表示第i中分類,xi表示某一特征的第i種數值第五步:根據第四步結果:選擇信息增益最大的特征“年齡”作為根節點根據年齡將樣本進行了區分:年齡小于30的節點落在了左側面年齡在30到40之間的節點落在了中間年齡大于40的節點落在了右側。9.1.2如何建立一棵決策樹——ID3建樹過程

9.1.2如何建立一棵決策樹——ID3建樹過程

針對這個表繼續計算,每個特征的信息增益,Gain(收入)≈0.971Gain(學生)≈0.420Gain(信用)≈0.020。因此使用“收入”進行下一步分裂此次判斷已經有了最終結果,即“買”或“不買”,這就是葉子節點。其他節點以此類推9.1.2如何建立一棵決策樹——C4.5建樹過程ID3算法并不是完美的,在上面的例子中將“年齡”、“收入”、“學生”、“信用”作為特征構建決策樹。如果將“序號”也含在特征中,看看“序號”的信息增益。如果將“序號”也含在特征中,看看“序號”的信息增益。info(c)≈0.940Info(c|x=1)=-1/1*log2(1/1)-0/1*log2(0/1)=0Info(c|x=2)=-1/1*log2(1/1)-0/1*log2(0/1)=0Info(c|x=3)=-1/1*log2(1/1)-0/1*log2(0/1)=0......Info(c|x=14)=-1/1*log2(1/1)-0/1*log2(0/1)=0所以Gain(序號)=info(c)-0≈0.940這時發現序號的信息增益最大,應該首先以序號為根節點進行判斷,可是這沒有意義,序號列信息增益大的原因完全是因為序號的種類“太瑣碎了”,從而導致條件信息熵是0。9.1.2如何建立一棵決策樹——C4.5建樹過程為了解決這個中由于某一個屬性取值種類太多造成的問題,又引入了信息增益率的概念。信息增益率的公式為:GainRatio(X)=Gain(X)/SplitInfo(X)。其中SplitInfo(X)是針對X特征本身的信息熵計算SplitInfo(年齡),年齡3種可能的概率分別是

小于30歲:5/1430到40歲:4/14大于40歲:5/14

則SplitInfo(年齡)=-5/14*log2(5/14)-4/14*log2(4/14)-5/14*log2(5/14)≈0.189由ID3計算過程可知:Gain(年齡)≈0.150所以GainRatio(年齡)=0.150/0.189≈0.7949.1.2如何建立一棵決策樹——C4.5建樹過程

序號列的信息增益率呢?序號列一共有14種取值,每種取值概率都是1/14,因此SplitInfo(序號)=-1/14*log2(1/14)-1/14*log2(1/14)......-1/14*log2(1/14)≈3.8由前面(PPT第12頁)計算可知:Gain(序號)=0.940所以GainRatio(序號)=0.940/3.8≈0.247選擇信息增益率大的特征作為優選的判斷特征。年齡的信息增益率(0.794)大于序號的信息增益率(0.247),因此年齡列比序號列更適合優先作為判斷節點。其他特征的信息增益率及比較方法相同,每次迭代選取信息增益率最大的特征作為判斷屬性,建立決策樹,這種算法叫做C4.5算法。現在選用信息熵作為建樹依據的方法多數都是選擇C4.5作為默認算法。9.1.2如何建立一棵決策樹——CART建樹過程除了信息熵,基尼系數(Gini)也可以作為建樹的依據,基尼系數也可以體現出事物的不確定性(不純度)。基尼系數的公式:其中I是所有的可能,i是某一種可能。某一屬性Gini系數增益的公式為:針對“年齡”列進行統計:

Gini(買|年齡)=1-(2/8)2

-(3/8)2

-(3/8)2

≈0.656Gini(不買|年齡)=1-(3/6)2

-(1/6)2

-(2/6)2

≈0.611Gain(年齡)=9/14*Gini(買|年齡)+5/14*Gini(不買|年齡)

≈0.6409.1.2如何建立一棵決策樹——CART建樹過程基尼系數的公式:其中I是所有的可能,i是某一種可能。某一列Gini系數增益的公式為:針對“收入”列進行統計:Gini(買|收入)=1-(2/9)2-(5/9)2-(2/9)2≈0.592Gini(不買|收入)=1-(2/5)2-(1/5)2-(2/5)2≈0.64Gain(收入)=9/14*Gini(買|收入)+5/14*Gini(不買|收入)

=9/14*0.592+5/14*0.64

≈0.6099.1.2如何建立一棵決策樹——CART建樹過程基尼系數的公式:其中I是所有的可能,i是某一種可能。某一列Gini系數增益的公式為:針對“學生”列進行統計:Gini(買|學生)=1-(5/9)2-(4/9)2≈0.494Gini(不買|學生)=1-(2/5)2-(3/5)2≈0.48Gain(學生)=9/14*Gini(買|學生)+5/14*Gini(不買|學生)≈0.4899.1.2如何建立一棵決策樹——CART建樹過程基尼系數的公式:其中I是所有的可能,i是某一種可能。某一列Gini系數增益的公式為:針對“信用”列進行統計:Gini(買|信用)=1-(3/9)2-(6/9)2≈0.444Gini(不買|信用)=1-(3/5)2-(2/5)2≈0.48Gain(信用)=9/14*Gini(買|信用)+5/14*Gini(不買|信用)

≈0.4579.1.2如何建立一棵決策樹——CART建樹過程選擇基尼增益小的特征作為判斷特征,顯然“信用”的信息增益系數最小,表示不純度最小,所以通過信用特征來判斷的結果能相對較“純”。Gain(年齡)

≈0.640Gain(收入)≈0.609Gain(學生)≈0.489Gain(信用)≈0.457各子節點依據以上方式繼續迭代9.1.2如何建立一棵決策樹——信息熵VS基尼系數無論是信息熵、信息增益、信息增益率還是基尼系數,中心思想都是找到判斷事務條件的不純度。越“純”的條件,判斷得越“靠譜”。在實際使用中,信息熵和基尼系數的效果基本相同。信息熵的計算比基尼系數緩慢一些,因為基尼系數的計算不涉及對數。另外,因為信息熵對不純度更加敏感,決策樹的生長會更加“精細”,但更容易過擬合,但當模型擬合程度不足的時候,可以使用信息熵。實戰中一般先選基尼系數,效果不好再換成信息熵9.1.3sklearn中的決策樹實現#第一步:導入數據#導入numpy和pandas數據包importnumpyasnpimportpandasaspd#從boston_lishi.csv文件中導入原始數據df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#X為原始數據中不包括target列部分,是由歷史數據中“非結果列”組成的數據X=df.loc[:,(df.columns!='target')]#Y為原始數據中target列部分,是由歷史數據中“結果列”組成的數據Y=df.loc[:,df.columns=='target']9.1.3sklearn中的決策樹實現#第二步:數據預處理#缺失值處理df.dropna()#其他數據預處理將在第6次課介紹9.1.3sklearn中的決策樹實現#第三步,建模#將歷史數據按照8:2的比例分隨機分為訓練集和測試集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)#導入決策樹工具包fromsklearn.treeimportDecisionTreeClassifierasDT#創建模型clf=DT()#訓練模型clf.fit(Xtrain,Ytrain)9.1.3sklearn中的決策樹實現#第四步,用測試集檢驗模型預測效果#使用predict方法,根據Xtest預測測試集的結果result=clf.predict(Xtest)#將測試集真實結果和預測結果進行對比df=pd.DataFrame({'真實結果':Ytest.loc[:,'target'],'預測結果':pd.Series(result,index=Ytest.index)})print(df)9.1.3sklearn中的決策樹實現#第四步,用測試集檢驗模型預測效果#可以使用一些指標來評價模型表現,例如使用R2值評價多元線性回歸score=clf.score(Xtest,Ytest)print(score)#其他指標(混淆矩陣、recall、AUC值等)與邏輯回歸中的實現方法完全一致,不再贅述9.1.3sklearn中的決策樹實現——決策樹模型的重要屬性#feature_importances:查看每個特征在構建決策樹時的重要程度。實現方法如下:#查看每個特征的重要程度df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#feature_importances_返回建模時,每個特征的重要程度fi=pd.Series(clf.feature_importances_,index=df.columns[0:-1])print(fi)9.1.4決策樹調參——決策樹的剪枝什么是剪枝?如果數據夠復雜,建立的決策樹也會很復雜,各種判斷條件和判斷結果“枝繁葉茂、層出不窮”,這樣做會出現連個問題。第一、過擬合,因為訓練得“太細”,導致整個模型過分依賴訓練數據;第二、計算性能低,因為樹結構太復雜,計算時需要占用大量資源,導致計算效率下降。為了避免樹結構過于復雜,可以采用剪枝的方法。剪枝顧名思義,就是刪除樹中的一部分節點和葉子。左圖為剪枝前的決策樹,右圖為剪之后的決策樹。9.1.4決策樹調參——決策樹中可以實現剪枝的參數max_depth,參數內容是整數。max_depth就是指定樹的最大深度,超過這個深度的中間節點和葉子節點統統砍掉,砍掉部分將變成一個葉子節點,這個節點的分類結果是砍掉部分樣本數最多的分類。調參時也可以使用學習曲線+交叉驗證的方法。min_samples_split,內容是整數,也是一個剪枝參數,一個節點必須要包含至少min_samples_split個樣本,否則不再進行分枝。還有一個類似的參數:min_samples_leaf,也是一個剪枝參數,一個節點在分枝后的每個子節點都必須包含至少min_samples_leaf個訓練樣本,否則不會在分枝,注意min_samples_leaf既可以是一個整數,表示樣本個數,也可以是一個浮點小數,表示樣本的比例。調參時也可以使用學習曲線+交叉驗證的方法。如果說max_depth是在原有樹基礎上大刀闊如的砍掉太深的節點,那min_samples_split和min_samples_leaf就是在建樹的過程中就小心翼翼的把握著樹的結構,所以用max_depth剪枝的方法叫后剪枝,即在建樹后剪枝;min_samples_split和min_samples_leaf叫先剪枝,即在建樹的過程中就控制樹的結構。二者可以配合使用。9.1.4決策樹調參——決策樹其他重要參數criterion,參數內容是是兩個可選數值:gini(基尼系數)和entropy(信息熵),也就是之前介紹的兩種建樹方法,默認值是基尼系數。在實戰中,一般先用基尼系數,如果結果不滿意,再換成信息熵。random_state,參數內容是數值型。在使用維度較高(特征較多)的數據建樹時,sklearn并不是將所有的特征都納入建樹過程,而是隨機的挑選一些建樹,random_state就是一種隨機狀態,不同隨機狀態挑選的特征不同,也就相當于建立了不同的決策樹。Splitter,參數內容是兩個可選值,best和random。上面提到random_state是在眾多特征中挑選一部分特征建樹,如果splitter參數選擇的是best,那么選擇的特征將更傾向于“重要的特征”(詳見feature_importance_屬性),如果splitter參數選擇的是random,那就是“徹底”的隨機選擇特征建樹了class_weight:

可以是None、balanced、或者字典類型。主要用于指定樣本各類別的的權重,這樣可以防止類不平衡問題(例如對于銀行欺詐行為的統計數據,可能1000個人當中只有1個騙子,如果按照原始數據建模,騙子的數據會非常少,很難真正找到騙子的特征,而且即使對于騙子預測失敗,把所有人都當好人,模型的準確率依然很好,因為有999個好人,準確率就是99.9%)。可以選用“balanced”,則算法會自己計算權重,樣本量少的類別所對應的樣本權重會高;還可以使用None,所有類別的權重都一樣,也可以通過字典型指定各個樣本的權重;。9.1.5決策樹的重要屬性和方法(1)屬性feature_importances_(2)apply()方法9.2回歸樹9.2.1回歸樹的工作原理決策樹主要是用于解決分類預測問題,決策樹的建樹方法還可以用于解決回歸問題。這就會可以使用回歸樹。假設有根據歷史數據建立如下回歸樹,目標是通過x1和x2的值預判y的取值:當一個被預測樣本x1=40,x2=38,求這個樣本的y值。這個被預測樣本應該落在左數第二個葉子節點上,這個葉子上有三個歷史y值,應該選哪個作為結果呢?答案是這個葉子節點所有歷史y值的平均值,即26。9.2.1回歸樹的工作原理——回歸樹的損失函數回歸樹為什么使用葉子節點所有樣本的平均值作為預測結果呢?這是通過回歸樹損失函數優化過程求得的。假設使用均方誤差作為損失函數評斷的依據,則損失函數如公式:其中f(xi)是通過回歸樹對樣本xi進行預測的值,yi是樣本xi的真實數值,i從1到n表示n個樣本。設f(xi)為其中m表示某個葉子號,Cm表示m號葉子返回的值,I表示是某片葉子是否和這個樣本發生關系,如果不發生關系I相當于0。所以f(xi)返回了所有和這個樣本相關葉子節點的返回值。將f(xi)代入損失函數得

,此時的J便是回歸樹的損失函數。目標為求J最小值時Cm取值

9.2.1回歸樹的工作原理——回歸樹的損失函數損失函數這個公式的意思是對于一個樣本i,找到所有(M個)和它有關的葉子,計算葉子返回值和真實值的方差,然后計算所有(n個)樣本的均方差。既然我們理解了這個公式的意思是,可以給它進行一個變形。我們可以針對某一個葉子,計算葉子返回值C和這個葉子所有相關樣本真實值的方差,然后再累加所有葉子節點上的方差,再除以樣本數,結果同樣是所有樣本的均方誤差。此時損失函數變為什么樣的Cm能讓這個損失函數最小呢?我們可以針對損失函數關于Cm求導,因為前面的M和n都是常數,所以求導時可以忽略不計,則損失函數J關于關于Cm求導,為:此時損失函數優化的目標就變成了求此導數等于0時的解。假設葉子中和樣本i相關的樣本有Nm個,則原公式變為

,求解得:由此可見當Cm取值為葉子中相關樣本值的平均值時損失函數可以取極值。9.2.2回歸樹建樹過程假設有如下數據:第一步:將原始數據按照X1小打到排序,則原數據表變為如下:9.2.2回歸樹建樹過程第一步生成的新數據表:第二步:以X1列中前2個數的平均值(5和10的平均值)7.5為分界線,將樣本分成兩部分,X1<7.5的樣本在左,X1>7.5的樣本在右9.2.2回歸樹建樹過程第三步:計算所有樣本方差此時,左面葉子的返回值是20,右面葉子的返回值是其他樣本y值的平均值

。然后將第一步得到新表中各個樣本根據x1取值放入指定葉子,例如第一行樣本x1等于5,小于7.5,所以被分到左邊葉子,計算該樣本y值與該葉子返回值之間的方差(20-20)2,即0;第二行樣本x1為10,大于7.5,所以被分到右邊葉子,計算該樣本y值與葉子返回值之間的方差(15-)2

;第三行樣本x1為20,大于7.5,所以落在葉子,計算該樣本y值18與葉子返回值的方差是(18-

)2。以此類推,計算所有樣本的均方差。9.2.2回歸樹建樹過程步驟四:以x1列第2和第3個數的平均值(10和20的平均值是15)為分界線,將數據分成兩部分,x1<15的落在左側,x1>15的落在右側,同樣計算所有樣本的均方差。步驟五:將X1列所有可能分枝的均方差都求出來步驟六:將X2和X3列所有可能分枝的均方差都求出來步驟七:找出均方差最小的分枝可能進行分枝,將數據的各個樣本分到左側和右側節點。步驟八:針對左側節點和右側節點的數據,按照步驟一到步驟六,計算所有可能分枝的均方差,找到最小均方差的分枝方法繼續分枝。步驟九:在新的分枝中不斷再分枝,直到符合停止分枝的條件(如分到了葉子節點、樹層數限制、分枝樣本條件數限制等)。9.2.3回歸樹的實現#第一步:導入數據#導入numpy和pandas數據包importnumpyasnpimportpandasaspd#從boston_lishi.csv文件中導入原始數據df=pd.read_csv(r'E:\boston_lishi.csv',index_col='id')#X為原始數據中不包括target列部分,是由歷史數據中“非結果列”組成的數據X=df.loc[:,(df

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論