機器學習隨筆(決策樹,集成算法,交叉驗證)


申明:全為我今天所學的知識的簡單總結,內容可能比較亂。只是為了做簡單的知識的回顧和總結,可能有些知識點也可以幫助解決遇到的問題。

1.pandas.read_csv()讀取CSV文件。在excel文件保存的時候可以保存為csv文件。

2.pandas.value_counts(data["列名“],sort=True).sort_index()  讀出該列中不同屬性值分別對應的個數

3.樣本不均衡怎么辦(比如說百分之90就是都是屬於0類,百分之10屬於1類),過采樣和下采樣。

下采樣:對於不均衡數據變成均衡數據,讓屬於0類和1類的一樣少。

過采樣:將少的樣本生成一些數據,使得0類和1類的數據一樣多。

4.From sklearn.preprocessing import StandardScaler(標准化數據,對於一些數據跟其他比起來比較大或者不規律,先標准化到0-1之間

data['新列名’]=StandardScaler().fit_transform(data['列名‘].reshape(-1,1))將想要標准化的那一列就行標准化,並且會新生成一個列,可以定義一個新的列名。reshape()一列,多少行讓程序自己去計算

data.drop['列名'].axis=0 ....(///////////////////////////////

data.ix[:,data.columns!='列名’]DataFrame中的ix操作先行后列,式子中表示所有行,但是不取指定的列。

5.np.random.choice(在哪選,選多少,是否可以代替)從數據中隨機選出一定數量的結果

np.concatenate()將數據進行合並

6.交叉驗證:(先對數據進行洗牌)去除數據的規律性

對數據進行切分,訓練數據和測試數據進行切分(當然這的測試數據只是為了交叉驗證,和廣義的測試數據不一樣。現在的所有切分都是在訓練數據上進行的)

假設分為三份A,B,C

首先用A+B進行訓練模型,然后用C來測試參數。 其次用A+C訓練模型,用B來測試參數。

最后用B+C進行訓練模型,然后用A來測試參數    (交叉驗證是為了驗證參數,當有幾個參數可選的時候用這個來驗證,也可以分為5段等)最后使數據盡量平穩不會太高也不會太低。

From sklearn.cross_validation import train_test_split#引入切分數據

為什么在下采樣的時候還要對原數據進行切分,因為下采樣的數據訓練完的模型是要用原數據的測試數據來進行測試,不是拿下采樣數據的測試數據來測試,畢竟量太少了。。

7.建模:邏輯回歸

精度:真實值和預測值進行比較,相等的總的數量比上所有的數量。

有些情況下,精度很高,但是沒什么實際作用。預測癌症,大家都預測出來沒毛病。但是其實我們是想要預測出來的。  所以精度會騙人。

recall:召回率。還是用癌症的例子說明。比方一共100人,10個有癌症。我們想要檢測出癌症的就是這10個人。召回率就是說最后我們檢測出來的人數比上我們想要檢測的總人數在這里也就是10.(使用更多)

召回率=TP/TP+FN  (混淆矩陣馬上說)

相關正類:TP 就是把本來是正例的預測成了正例     無關負類:FP 把本來是負類預測稱了正類

FN :正類判定為負類        TN:負類判定為負類。(個數)

 

 

 

 

From sklearn.linear_model import LogiticRsgression#邏輯回歸

From sklearn.cross_validation  import KFold(這個數表示做幾倍的交叉驗證)

cross_val_score評估結果         根據不同的threshold來畫混淆矩陣

 

 

 正則化:

在召回率相同的情況下,判斷模型的參數值太過於浮動不行,需要穩定,防止過擬合危險。

正則化懲罰項:大力懲罰波動較大的參數模型

loss損失函數+1/2W的平方加上懲罰函數,越不穩定,loss越大,加上懲罰函數再來比較兩個參數模型。

L2正則化加的1/2W的平方      L1正則化直接加W的絕對值

可以在L1和L2前加倍數。λL2的λ等於多少效果會更好,可以以通過交叉驗證來評估。

邏輯回歸模型LogisticRegression(C=(懲罰系數λ),正則化類型L1或者L2)

用交叉驗證出來的值去訓練模型

recall_score()計算召回率

8.混淆矩陣

x軸為預測值,Y軸為真實值,來計算衡量指標recal和精度

9.下采樣法,才通過混淆矩陣可以看到,召回率是高了,但是導致有許多被誤殺的,預測錯了/使得精度降低,這是下采樣的潛在問題

10.過采樣:

SMOTE樣本生成策略。對於少數類的每一個樣本,以歐氏距離為標准計算他到少數類樣本集總所有樣本的距離,使得到其K近鄰

確定采樣倍率。 假設五倍。  選擇d1到d5(這些都是x的k近鄰),用公式構建樣本。

對於d1到d5:Xnew=x+rand(0,1)×(x(上邊有波浪)-x)表示二者之間的距離

 

引入SMOTE:FROM imblearn.over_sampling(下采樣,under)   import SMOTE

SMOTE.fit_sample(只對訓練集操作)

 

誤殺率比下采樣低,當然recall也要低一點。

10.決策樹:

衡量標准:熵值
表示隨機變量的不確定性的度量

H(x)=-sum(p×logp)越大概率的得到的熵值越小,反之越大
決策一個節點的選擇:
信息增益:表示特正X使得Y的不確定性減小的程度
遍歷每個特征使得分類的熵值降低,減小不確定性
將使不確定性減少最多的特征為根節點,其他依次按照此排序


構造決策樹:計算拿哪個特征值作為根結點比較合適

e.g.  9天打球,5天不打 此時的熵為9/14×log29/14+。。。。=0.940

基於不同特征時計算不同結果的熵值“:
以天氣為根節點:
晴天:2天yes,3天NO,所以熵值為2/5乘以log2/5+...0.971
雨天: 0.971
對於沒種天氣的概率,雨天4/14,晴天5/14
總的熵值就等於:該天氣概率乘以熵值+。。。=該特征的熵值《0.940
所以增益了

 


然后把其他特征也以這種方式計算增益,然后,找到最大增益的為根節點,

ID3算法:就是基於增益的算法
(假設拿ID作為特征 每個葉子節點熵值都為0 信息增益最大 但是ID只是一個編號對結果沒有任何影響,但是其熵值爭議增益最大,會把他作為最優特征,但這是不符合現實的

C4.5:ID3算法升級 信息增益率
考慮自身熵 對於ID本身【1,2,3,4,5,6,7】自身熵值是很大的

信息增益率就等於=信息增益/自身熵值 就可以避免上面ID的那種情況

CART:用GINI系數來做衡量標准 和熵值類似衡量標准類似,只是計算方式不同
計算公式:SUM(Pk(1-Pk))=1-SUM(Pk的平方)

 

連續值怎么辦?就是說針對某一個特征時並沒有很明確的子類,即像天氣可以由晴天和雨天,但是沒有這一些明確的分類時,而是一堆連續的數字,那么該如何求解其增益等等,就可以二分。找一個數作文二分的標准,然后小於他的作為一個屬性來看待,大於他的又是一個,這樣既可求解增益值。
連續值離散化 二分 找一個點按這個點來進行切分

11.決策樹剪枝策略

決策樹過擬合風險比較大,在測試集上效果不如在訓練集上。
預剪枝邊建立決策樹邊進行剪枝 控制樹的深度,葉子結點個數
限制廣度

限制深度:限制特征 限制葉子結點個數
限制葉子節點樣本數

后剪枝Cα(T)=C(T)+α乘Tleaf的絕對值

Ct表示當前的一個損失,對每一個葉節點點,葉子節點樣本數乘熵值或者基尼系數 把所有葉子節點損失加在一起
α表示限制葉子結點個數
葉子結點越多損失越大

 

12.sklearn實現

tree.DecisoinTreeRegressor(max_depth=1).fit()

參數:

1.criterion gini or entropy 選擇熵或者基尼系數
2.splitter best or random 特征比較大的時候,從頭到尾選擇特征耗時間,best遍歷所有,random選擇其中一部分,默認best
3.max_features None
常用:4.max_depth最大深度,只選擇最好的兩個特征
常用:5.min——samples——split 葉子結點的樣本數小於規定值則不要再份了
6.min_samples_laef限制了葉子節點最少的樣本數 如果某葉子結點樣本數目小於該值則回合兄弟節點一起被剪紙,如果樣本量不大。則不需要管,如果10W則可嘗試5
7.max_leaf_nodes通過限制最大的葉子節點數防止過擬合

12.決策樹可視化

生成一個.dot文件:

dot_data=
tree.export_graphviz(
dtr(樹的實例),
out_file=None,
feature_names=housing.feature_names[6:8]
filler=True
impurity=False,
rounded=True
)###生成一個.dot文件

展示一個.dot文件:

import pydotplus
graph=pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor("顏色")
from IPython.diplay import Image
Image(graph.create_png())

13.參數選擇,用gridsearch來選擇

 

sklearn.grid_search import GridSearchCV###也是通過交叉驗證的
參數:(算法傳進去,參數(用字典的格式),cv=5(進行幾次的交叉驗證 把訓練集平均分開n份,A+B建模,C測試 最后吧每次結果取個平均)
grid.fit(_)
grid.grid_scores_,grid.best_params_,grid.best_score_

 

13.集成算法

Bagging:訓練多個分類器取平均 f(x)=1/M SUM(Fm(x))
並行訓練13.
e.g

 


隨機森林 隨機:不同的樹之間是有差異的,不是一模一樣的。不是數越多越好。到一定程度就上下浮動了。

 


數據采樣隨機(有放回,隨機),特征選擇隨機(隨機選擇N個)
優勢:
不用特征選 擇方案,可以處理高維度問題
A B C D 想要知道B特征的重要性 剛開始利用ABCD來訓練。得到一個錯誤率,然后破壞B的數據構造B1,然后繼續用AB1CD來訓練得到第二個錯誤,比較這兩個錯誤
A+B+C+D=====error1
A+B1+C+D====error2
error1約等於error2 B不重要 對結果影響不大
2>>>1遠大於1 說明B的作用很大


Boosting模型:從弱學習器開始加強,通過加權來進行訓練
A預測 有誤差50 B樹去預測殘差 30 C樹預測18 最終還有誤差2
串行算法
典型代表:
AdaBoost,Xgboost
AdaBoost會根據前一次的分類效果調整數據權重
如果某一個數據在這次分錯了,那么下一次就給他更大的權重
剛開始給每個測試數據一個權重
根據測試結果,對錯的將其權重增加,當然
其他權重降低之后也可能會預測錯,每次修改權重
權重越大,切分時越朝着它,
最終結果:每個分類器根據自身准確性來確定各自的權重,再合體分類越好權值越重

 


Stacking:

堆疊:堆疊各種各樣的算法
第一階段將特征輸入得到結果值,可以選擇任意多的分類器
第二階段將第一階段的輸出作為輸入,輸出其結果

ROC和AUC明天在進行記錄。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM