《菜菜的机器学习sklearn课堂,tomcat架构解析pdf
前言
最近正是跳槽季,可是最近許多的HR朋友卻經常在群里或者朋友圈里抱怨,說現在的應屆畢業生們跳槽跳的太快,“應屆生來了兩周就走人,我還什么都沒教給他呢!”“招人的速度趕不上他們離職的速度啊!”
而離職人員又委屈伸冤:“錢又少事又多,企業當我們免費勞動力嗎?”“你們公司不適合我,我還留著干嘛呢?”
那么問題來了,對于剛進入職場的這些新人們來說,到底工作多久跳槽才合適呢?
首先要強調的,就是三個月內最好不要辭職或者跳槽
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
2、探索數據
wine = load_wine() #讀取紅酒數據集
wine.data #特征數據
wine.target # 標簽
wine.feature_names #特征名
wine.target_names #標簽名
#如果wine是一張表,應該長這樣:
import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
3、劃分訓練集和測試集
#劃分30%的數據作為測試集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)
Xtrain.shape #訓練集: 124行,13個標簽
Xtest.shape #測試集: 54行,13個標簽
wine.data.shape #初始數據集: 178行,13個標簽
4、建立模型(只有一個參數criterion)
clf = tree.DecisionTreeClassifier(criterion=“entropy”) #建模
clf = clf.fit(Xtrain, Ytrain) #訓練模型
score = clf.score(Xtest, Ytest) #返回預測的準確度
score
5、畫出一棵樹吧
feature_name = [‘酒精’,‘蘋果酸’,‘灰’,‘灰的堿性’,‘鎂’,‘總酚’,‘類黃酮’,‘非黃烷類酚類’,‘花青素’,‘顏色強度’,‘色調’,‘od280/od315稀釋葡萄酒’,‘脯氨酸’]
import graphviz
dot_data = tree.export_graphviz(clf, #模型
feature_names = feature_name, #特征名
class_names = [‘琴酒’, ‘雪莉’, ‘貝爾摩德’], #分類名
filled = True, #填充顏色表示不同的分類
rounded = True #圓角顯示
)
graph = graphviz.Source(dot_data)
graph
6、探索決策樹
clf.feature_importances_ #特征重要性
[*zip(feature_name, clf.feature_importances_)]
[(‘酒精’, 0.0),
(‘蘋果酸’, 0.0),
(‘灰’, 0.0),
(‘灰的堿性’, 0.0),
(‘鎂’, 0.05809139359761723),
(‘總酚’, 0.0),
(‘類黃酮’, 0.42809846427963527),
(‘非黃烷類酚類’, 0.0),
(‘花青素’, 0.0),
(‘顏色強度’, 0.18211551456095545),
(‘色調’, 0.0),
(‘od280/od315稀釋葡萄酒’, 0.0),
(‘脯氨酸’, 0.331694627561792)]
我們已經在只了解一個參數的情況下,建立了一棵完整的決策樹。但是回到步驟4建立模型,score會在某個值附近波動,引起步驟5中畫出來的每一棵樹都不一樣。它為什么會不穩定呢?如果使用其他數據集,它還會不穩定嗎?
我們之前提到過,無論決策樹模型如何進化,在分枝上的本質都還是追求某個不純度相關的指標的優化,而正如我們提到的,不純度是基于節點來計算的,也就是說,決策樹在建樹時,是靠優化節點來追求一棵優化的樹,但最優的節點能夠保證最優的樹嗎?集成算法被用來解決這個問題:sklearn表示,既然一棵樹不能保證最優,那就建更多的不同的樹,然后從中取最好的。怎樣從一組數據集中建不同的樹?在每次分枝時,不從使用全部特征,而是隨機選取一部分特征,從中選取不純度相關指標最優的作為分枝用的節點。這樣,每次生成的樹也就不同了。
clf = tree.DecisionTreeClassifier(criterion=“entropy”,random_state=30)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) #返回預測的準確度
score
[](()random_state、splitter
random_state 用來設置分枝中的隨機模式的參數,默認None,在高維度時隨機性會表現更明顯,低維度的數據(比如鳶尾花數據集),隨機性幾乎不會顯現。輸入任意整數,會一直長出同一棵樹,讓模型穩定下來。
splitter 也是用來控制決策樹中的隨機選項的,有兩種輸入值,
-
輸入best,決策樹在分枝時雖然隨機,但是還是會優先選擇更重要的特征進行分枝(重要性可以通過屬性feature_importances_查看)
-
輸入random,決策樹在分枝時會更加隨機,樹會因為含有更多的不必要信息而更深更大,并因這些不必要信息而降低對訓練集的擬合。這也是防止過擬合的一種方式。
當你預測到你的模型會過擬合,用這兩個參數來幫助你降低樹建成之后過擬合的可能性。當然,樹一旦建成,我們依然是使用剪枝參數來防止過擬合。
clf = tree.DecisionTreeClassifier(criterion=“entropy”
,random_state=30
,splitter=“random”
)
clf = clf.fit(Xtrain, Ytrain) #訓練模型
score = clf.score(Xtest, Ytest) #返回預測的準確度
score
import graphviz
dot_data = tree.export_graphviz(clf
,feature_names= feature_name
,class_names=[“琴酒”,“雪莉”,“貝爾摩德”]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
[](()剪枝參數
在不加限制的情況下,一棵決策樹會生長到衡量不純度的指標最優,或者沒有更多的特征可用為止。這樣的決策樹往往會過擬合,這就是說,它會在訓練集上表現很好,在測試集上卻表現糟糕。我們收集的樣本數據不可能和整體的狀況完全一致,因此當一棵決策樹對訓練數據有了過于優秀的解釋性,它找出的規則必然包含了訓練樣本中的噪聲,并使它對未知數據的擬合程度不足。
#我們的樹對訓練集的擬合程度如何?
score_train = clf.score(Xtrain, Ytrain)
score_train
為了讓決策樹有更好的泛化性,我們要對決策樹進行剪枝。剪枝策略對決策樹的影響巨大,正確的剪枝策略是優化決策樹算法的核心。sklearn為我們提供了不同的剪枝策略:
max_depth
-
限制樹的最大深度,超過設定深度的樹枝全部剪掉
-
這是用得最廣泛的剪枝參數,在高維度低樣本量時非常有效。決策樹多生長一層,對樣本量的需求會增加一倍,所以限制樹深度能夠有效地限制過擬合。在集成算法中也非常實用。實際使用時,建議從=3開始嘗試,看看擬合的效果再決定是否增加設定深度。
min_samples_leaf & min_samples_split
- min_samples_leaf 限定一個節點在分枝后的每個子節點都必須包含至少min_samples_leaf個訓練樣本,否則分枝就不會發生,或者分枝會朝著滿足每個子節點都包含min_samples_leaf個樣本的方向去發生
一般搭配 max_depth 使用,在回歸樹中有神奇的效果,可以讓模型變得更加平滑。這個參數的數量設置得太小會引起過擬合,設置得太大就會阻止模型學習數據。一般來說,建議從=5開始使用。如果葉節點中含有的樣本量變化很大,建議輸入浮點數作為樣本量的百分比來使用。同時,這個參數可以保證每個葉子的最小尺寸,可以在回歸問題中避免低方差,過擬合的葉子節點出現。對于類別不多的分類問題,=1通常就是最佳選擇。
- min_samples_split 限定一個節點必須要包含至少min_samples_split個訓練樣本,這個節點才允許被分枝,否則分枝就不會發生。
clf = tree.DecisionTreeClassifier(criterion=“entropy”
,random_state=30
,splitter=“random”
,max_depth=3
,min_samples_leaf=10
,min_samples_split=10
)
clf = clf.fit(Xtrain, Ytrain)
dot_data = tree.export_graphviz(clf
,feature_names= feature_name
,class_names=[“琴酒”,“雪莉”,“貝爾摩德”]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
clf.score(Xtrain,Ytrain)
clf.score(Xtest,Ytest)
max_features & min_impurity_decrease
- max_features 是限制分枝時考慮的特征個數,超過限制個數的特征都會被舍棄。
和max_depth異曲同工,max_features是用來限制高維度數據的過擬合的剪枝參數,但其方法比較暴力,是直接限制可以使用的特征數量而強行使決策樹停下的參數,在不知道決策樹中的各個特征的重要性的情況下,強行設定這個參數可能會導致模型學習不足。如果希望通過降維的方式防止過擬合,建議使用PCA,ICA或者特征選擇模塊中的降維算法。
- min_impurity_decrease 限制信息增益的大小,信息增益小于設定數值的分枝不會發生。這是在0.19版本中更新的功能,在0.19版本之前時使用min_impurity_split
如何確認最優的剪枝參數?
- 使用確定超參數的曲線來進行判斷;
繼續使用我們已經訓練好的決策樹模型clf。
超參數的學習曲線,是一條以超參數的取值為橫坐標,模型的度量指標為縱坐標的曲線,它是用來衡量不同超參數取值下模型的表現的線。
在我們建好的決策樹里,我們的模型度量指標就是score。
import matplotlib.pyplot as plt
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(max_depth=i+1
,criterion=“entropy”
,random_state=30
,splitter=“random”
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
test.append(score)
plt.plot(range(1,11),test,color=“red”,label=“max_depth”)
plt.legend()
plt.show()
思考:
1、剪枝參數一定能夠提升模型在測試集上的表現嗎?
答:調參沒有絕對的答案,一切都是看數據本身。
2、這么多參數,一個個畫學習曲線?
答:無論如何,剪枝參數的默認值會讓樹無盡地生長,這些樹在某些數據集上對內存的消耗可能非常巨大。所以如果你手中的數據集非常大,你已經預測到無論如何都是要剪枝的,那提前設定這些參數來控制樹的復雜性和大小會比較好。
[](()目標權重參數 class_weight、min_weight_fraction_leaf
完成樣本標簽平衡的參數。
樣本不平衡是指在一組數據集中,標簽的一類天生占有很大的比例。
比如說,在銀行要判斷 “一個辦了信用卡的人是否會違約”,就是 “是"vs"否” (1% : 99%) 的比例。這種分類狀況下,即便模型什么也不做,全把結果預測成"否",正確率也能有99%。
class_weight
- 我們要使用class_weight參數對樣本標簽進行一定的均衡,給少量的標簽更多的權重,讓模型更偏向少數類,向捕獲少數類的方向建模。
該參數默認None,此模式表示自動給與數據集中的所有標簽相同的權重。
min_weight_fraction_leaf
- 有了權重之后,樣本量就不再是單純地記錄數目,而是受輸入的權重影響了,因此這時候剪枝,就需要搭配min_weight_fraction_leaf這個基于權重的剪枝參數來使用。
另請注意,基于權重的剪枝參數(例如min_weight_fraction_leaf)將比不知道樣本權重的標準(比如min_samples_leaf)更少偏向主導類。如果樣本是加權的,則使用基于權重的預修剪標準來更容易優化樹結構,這確保葉節點至少包含樣本權重的總和的一小部分。
[](()重要屬性 feature_importances_
屬性是在模型訓練之后,能夠調用查看的模型的各種性質。
對決策樹來說,最重要的是feature_importances_,能夠查看各個特征對模型的重要性。
[](()常用接口 fit、score、apply、predict
sklearn中許多算法的接口都是相似的,比如說我們之前已經用到的fit和score,幾乎對每個算法都可以使用。除了這兩個接口之外,決策樹最常用的接口還有apply和predict。
-
apply中輸入測試集返回每個測試樣本所在的葉子節點的索引
-
predict輸入測試集返回每個測試樣本的標簽,返回的內容一目了然并且非常容易
#apply返回每個測試樣本所在的葉子節點的索引
clf.apply(Xtest)
#predict返回每個測試樣本的分類/回歸結果
clf.predict(Xtest)
[](()實例:分類樹在合成數集上的表現
==================================================================================
啊啊,好難
我們在紅酒數據集上畫出了一棵樹,并且展示了多個參數會對樹形成這樣的影響,接下來,我們將在不同結構的數據集上測試一下決策樹的效果,來更好地理解決策樹。
1、導入需要的庫
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.tree import DecisionTreeClassifier
2、生成三種數據集
我們從sklearn自帶的數據庫中生成三種類型的數據集:
1)月亮型數據,2)環形數據,3)二分型數據
#make_classification庫生成隨機的二分型數據
X, y = make_classification(n_samples=100, #生成100個樣本
n_features=2, #包含2個特征,即生成二維數據
n_redundant=0, #添加冗余特征0個
n_informative=2, #包含信息的特征是2個
random_state=1, #隨機模式1
n_clusters_per_class=1 #每個簇內包含的標簽類別有1個
)
#在這里可以查看一下X和y,其中X是100行帶有兩個2特征的數據,y是二分類標簽
#也可以畫出散點圖來觀察一下X中特征的分布
#plt.scatter(X[:,0],X[:,1])
#從圖上可以看出,生成的二分型數據的兩個簇離彼此很遠,這樣不利于我們測試分類器的效果,因此我們使用np生成
#隨機數組,通過讓已經生成的二分型數據點加減0~1之間的隨機數,使數據分布變得更散更稀疏
#注意,這個過程只能夠運行一次,因為多次運行之后X會變得非常稀疏,兩個簇的數據會混合在一起,分類器的效應會繼續下降
rng = np.random.RandomState(2) #生成一種隨機模式
X += 2 * rng.uniform(size=X.shape) #加減0~1之間的隨機數
linearly_separable = (X, y) #生成了新的X,依然可以畫散點圖來觀察一下特征的分布
#plt.scatter(X[:,0],X[:,1])
#用make_moons創建月亮型數據,make_circles創建環形數據,并將三組數據打包起來放在列表datasets中
datasets = [make_moons(noise=0.3, random_state=0),
make_circles(noise=0.2, factor=0.5, random_state=1),
linearly_separable]
3、畫出三種數據集和三棵決策樹的分類效應圖像
#創建畫布,寬高比為6*9
figure = plt.figure(figsize=(6, 9))
#設置用來安排圖像顯示位置的全局變量i
i = 1
#開始迭代數據,對datasets中的數據進行for循環
for ds_index, ds in enumerate(datasets):
#對X中的數據進行標準化處理,然后分訓練集和測試集
X, y = ds
X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4,random_state=42)
#找出數據集中兩個特征的最大值和最小值,讓最大值+0.5,最小值-0.5,創造一個比兩個特征的區間本身更大一點的區間
x1_min, x1_max = X[:, 0].min() - .5, X[:, 0].max() + .5
x2_min, x2_max = X[:, 1].min() - .5, X[:, 1].max() + .5
#用特征向量生成網格數據,網格數據,其實就相當于坐標軸上無數個點
#函數np.arange在給定的兩個數之間返回均勻間隔的值,0.2為步長
#函數meshgrid用以生成網格數據,能夠將兩個一維數組生成兩個二維矩陣。
#如果第一個數組是narray,維度是n,第二個參數是marray,維度是m。那么生成的第一個二維數組是以narray為行,m行的矩陣,而第二個二維數組是以marray的轉置為列,n列的矩陣
#生成的網格數據,是用來繪制決策邊界的,因為繪制決策邊界的函數contourf要求輸入的兩個特征都必須是二維的
array1,array2 = np.meshgrid(np.arange(x1_min, x1_max, 0.2),
np.arange(x2_min, x2_max, 0.2))
#接下來生成彩色畫布
#用ListedColormap為畫布創建顏色,#FF0000正紅,#0000FF正藍
cm = plt.cm.RdBu
cm_bright = ListedColormap([‘#FF0000’, ‘#0000FF’])
#在畫布上加上一個子圖,數據為len(datasets)行,2列,放在位置i上
ax = plt.subplot(len(datasets), 2, i)
#到這里為止,已經生成了0~1之間的坐標系3個了,接下來為我們的坐標系放上標題
#我們有三個坐標系,但我們只需要在第一個坐標系上有標題,因此設定if ds_index==0這個條件
if ds_index == 0:
ax.set_title(“Input data”)
#將數據集的分布放到我們的坐標系上
#先放訓練集
ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train,
cmap=cm_bright,edgecolors=‘k’)
#放測試集
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test,
cmap=cm_bright, alpha=0.6,edgecolors=‘k’)
#為圖設置坐標軸的最大值和最小值,并設定沒有坐標軸
ax.set_xlim(array1.min(), array1.max())
ax.set_ylim(array2.min(), array2.max())
ax.set_xticks(())
ax.set_yticks(())
#每次循環之后,改變i的取值讓圖每次位列不同的位置
i += 1
#至此為止,數據集本身的圖像已經布置完畢,運行以上的代碼,可以看見三個已經處理好的數據集
#############################從這里開始是決策樹模型##########################
#迭代決策樹,首先用subplot增加子圖,subplot(行,列,索引)這樣的結構,并使用索引i定義圖的位置
#在這里,len(datasets)其實就是3,2是兩列
#在函數最開始,我們定義了i=1,并且在上邊建立數據集的圖像的時候,已經讓i+1,所以i在每次循環中的取值是2,4,6
ax = plt.subplot(len(datasets),2,i)
#決策樹的建模過程:實例化 → fit訓練 → score接口得到預測的準確率
clf = DecisionTreeClassifier(max_depth=5)
clf.fit(X_train, y_train)
score = clf.score(X_test, y_test)
#繪制決策邊界,為此,我們將為網格中的每個點指定一種顏色[x1_min,x1_max] x [x2_min,x2_max]
#分類樹的接口,predict_proba,返回每一個輸入的數據點所對應的標簽類概率
#類概率是數據點所在的葉節點中相同類的樣本數量/葉節點中的樣本總數量
#由于決策樹在訓練的時候導入的訓練集X_train里面包含兩個特征,所以我們在計算類概率的時候,也必須導入
#結構相同的數組,即是說,必須有兩個特征
#ravel()能夠將一個多維數組轉換成一維數組
#np.c_是能夠將兩個數組組合起來的函數
#在這里,我們先將兩個網格數據降維降維成一維數組,再將兩個數組鏈接變成含有兩個特征的數據,再帶入決策
#樹模型,生成的Z包含數據的索引和每個樣本點對應的類概率,再切片,且出類概率
Z = clf.predict_proba(np.c_[array1.ravel(),array2.ravel()])[:, 1]
#np.c_[np.array([1,2,3]), np.array([4,5,6])]
#將返回的類概率作為數據,放到contourf里面繪制去繪制輪廓
Z = Z.reshape(array1.shape)
ax.contourf(array1, array2, Z, cmap=cm, alpha=.8)
#將數據集的分布放到我們的坐標系上
將訓練集放到圖中去
ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright,
edgecolors=‘k’)
將測試集放到圖中去
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
edgecolors=‘k’, alpha=0.6)
#為圖設置坐標軸的最大值和最小值
ax.set_xlim(array1.min(), array1.max())
ax.set_ylim(array2.min(), array2.max())
#設定坐標軸不顯示標尺也不顯示數字
ax.set_xticks(())
ax.set_yticks(())
#我們有三個坐標系,但我們只需要在第一個坐標系上有標題,因此設定if ds_index==0這個條件
if ds_index == 0:
ax.set_title(“Decision Tree”)
#寫在右下角的數字
ax.text(array1.max() - .3, array2.min() + .3, (‘{:.1f}%’.format(score*100)),
size=15, horizontalalignment=‘right’)
#讓i繼續加一
i += 1
plt.tight_layout()
plt.show()
復習的面試資料
這些面試全部出自大廠面試真題和面試合集當中,小編已經為大家整理完畢(PDF版)
- 第一部分:Java基礎-中級-高級
- 第二部分:開源框架(SSM:Spring+SpringMVC+MyBatis)
- 第三部分:性能調優(JVM+MySQL+Tomcat)
- 第四部分:分布式(限流:ZK+Nginx;緩存:Redis+MongoDB+Memcached;通訊:MQ+kafka)
- 第五部分:微服務(SpringBoot+SpringCloud+Dubbo)
- 第六部分:其他:并發編程+設計模式+數據結構與算法+網絡
進階學習筆記pdf
- Java架構進階之架構筑基篇(Java基礎+并發編程+JVM+MySQL+Tomcat+網絡+數據結構與算法)
- Java架構進階之開源框架篇(設計模式+Spring+SpringMVC+MyBatis)
- Java架構進階之分布式架構篇 (限流(ZK/Nginx)+緩存(Redis/MongoDB/Memcached)+通訊(MQ/kafka))
- Java架構進階之微服務架構篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
[外鏈圖片轉存中…(img-pyT7k52W-1649752884207)]
- 第五部分:微服務(SpringBoot+SpringCloud+Dubbo)
[外鏈圖片轉存中…(img-SqOrFQn5-1649752884208)]
- 第六部分:其他:并發編程+設計模式+數據結構與算法+網絡
[外鏈圖片轉存中…(img-Op1xf6Pq-1649752884209)]
進階學習筆記pdf
- Java架構進階之架構筑基篇(Java基礎+并發編程+JVM+MySQL+Tomcat+網絡+數據結構與算法)
[外鏈圖片轉存中…(img-Kr25VKvc-1649752884209)]
- Java架構進階之開源框架篇(設計模式+Spring+SpringMVC+MyBatis)
[外鏈圖片轉存中…(img-gKi11oc7-1649752884210)]
[外鏈圖片轉存中…(img-gWUN9Ban-1649752884210)]
[外鏈圖片轉存中…(img-gOfjdbX4-1649752884211)]
- Java架構進階之分布式架構篇 (限流(ZK/Nginx)+緩存(Redis/MongoDB/Memcached)+通訊(MQ/kafka))
[外鏈圖片轉存中…(img-swurKawQ-1649752884211)]
[外鏈圖片轉存中…(img-AsHH75tv-1649752884212)]
[外鏈圖片轉存中…(img-BY1hX9XM-1649752884212)]
- Java架構進階之微服務架構篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
[外鏈圖片轉存中…(img-JnFumZAz-1649752884213)]
[外鏈圖片轉存中…(img-2aNuYu6L-1649752884213)]
阿里P7熬夜整理的《Java全套學習手冊》,火爆IT圈
總結
以上是生活随笔為你收集整理的《菜菜的机器学习sklearn课堂,tomcat架构解析pdf的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux不适合数据传输,【Linux调
- 下一篇: Hotspot hotswap, wh