背景介紹
從學sklearn時,除了算法的坎要過,還得學習matplotlib可視化,對我的實踐應(yīng)用而言,可視化更重要一些,然而matplotlib的易用性和美觀性確實不敢恭維。陸續(xù)使用過plotly、seaborn,最終定格在了Bokeh,因為它可以與Flask完美的結(jié)合,數(shù)據(jù)看板的開發(fā)難度降低了很多。
前陣子看到這個庫可以較為便捷的實現(xiàn)數(shù)據(jù)探索,今天得空打算學習一下。原本訪問的是英文文檔,結(jié)果發(fā)現(xiàn)已經(jīng)有人在做漢化,雖然看起來也像是谷歌翻譯的,本著拿來主義,少費點精力的精神,就半抄半學,還是發(fā)現(xiàn)了一些與文檔不太一致的地方。
# http://www.scikit-yb.org/zh/latest/quickstart.html
# http://www.scikit-yb.org/en/latest/quickstart.html
import pandas as pd
data = pd.read_csv('data/bikeshare/bikeshare.csv')
X = data[[
"season", "month", "hour", "holiday", "weekday", "workingday",
"weather", "temp", "feelslike", "humidity", "windspeed"
]]
y = data["riders"]
from yellowbrick.features import Rank2D
visualizer = Rank2D(algorithm="pearson")
visualizer.fit_transform(X.values)
visualizer.poof() # 在notebook顯示
# visualizer.poof(outpath="pcoords.jpg",clear_figure=True) # 輸出為png、jpg格式
由上圖可以看出特征向量7、8為強相關(guān);0、1相關(guān)系數(shù)也比較高。
下面再來通過曲線擬合看看兩者的相關(guān)度。
from yellowbrick.features import JointPlotVisualizer
visualizer = JointPlotVisualizer(feature='temp', target='feelslike')
visualizer.fit(X['temp'], X['feelslike'])
visualizer.poof()
JointPlotVisualizer 讓我們能快速瀏覽有強相關(guān)性的特征,以及各個特征的范圍和分布情況。需要注意的是圖中的各個軸都已經(jīng)標準化到0到1之間的值,這是機器學習中一中非常常用的減少一個特征對另一個影響的技術(shù)。
from yellowbrick.regressor import ResidualsPlot
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# Create training and test sets
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.1
)
visualizer = ResidualsPlot(LinearRegression())
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.poof()
殘差圖還向我們展示了模型的誤差是怎么產(chǎn)生的:那根加粗的水平線表示的是 residuals = 0 ,也就是沒有誤差;線上方或者下方的點則表示誤差值的大小。比如大部分殘差是負值,并且其值是由 actual - expected 算得,也就是說大部分時間預(yù)測值比實際值要大,比如和實際相比我們的模型總是預(yù)測有更多的騎手。|
import numpy as np
from sklearn.linear_model import RidgeCV
from yellowbrick.regressor import AlphaSelection
# RidgeCV:多個阿爾法,得出多個對應(yīng)最佳的w,然后得到最佳的w及對應(yīng)的阿爾法
alphas = np.logspace(-10, 1, 200)
visualizer = AlphaSelection(RidgeCV(alphas=alphas))
visualizer.fit(X, y)
visualizer.poof()
alpha = visualizer.alpha_
visualizer.alpha_
3.612342699709438
在探索模型家族的過程中,第一個要考慮的是模型是怎樣變得更 復(fù)雜 的。當模型的復(fù)雜度增加,由于方差增加形成的誤差也相應(yīng)增加,因為模型會變得過擬合并且不能泛化到未知數(shù)據(jù)上。然而,模型越簡單由于偏差造成的誤差就會越大;模型欠擬合,因此有更多的未中靶預(yù)測。大部分機器學習的目的就是要產(chǎn)生一個 復(fù)雜度適中 的模型,在偏差和方差之間找到一個中間點。
對一個線性模型來說,復(fù)雜度來自于特征本身以及根據(jù)模型賦予它們的值。因此對線性模型期望用 最少的特征 達到最好的闡釋結(jié)果。 正則化 是實現(xiàn)如上目標的其中一種技術(shù),即引入一個alpha參數(shù)來對其相互之間系數(shù)的權(quán)重進行標準化并且懲罰其復(fù)雜度。Alpha和復(fù)雜度之間是一個負相關(guān)。alpha值越大,復(fù)雜度越小,反之亦然。
我們現(xiàn)在可以訓練我們最終的模型并且用 PredictionError 對其進行可視化了:
from sklearn.linear_model import Ridge
from yellowbrick.regressor import PredictionError
visualizer = PredictionError(Ridge(alpha=alpha))
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.poof()
用預(yù)測誤差visualizer將實際(測量)值對期望(預(yù)測)值進行可視化。黑色的45度虛線表示誤差為0的點。和殘差圖一樣,這讓我們可以看到誤差在何處出現(xiàn),值為多大。
在這個圖上,我們可以看到大部分的點集中在小于200騎手的位置。我們也許想要嘗試用正交匹配追蹤算法(OMP)或者樣條(spline)來訓練一個將更多區(qū)域性考慮進來的回歸模型。我們還可以看到殘差圖中奇怪的拓撲結(jié)構(gòu)好像已被Ridge回歸糾正,而且在我們的模型中大值和小值之間有了更多的平衡。Ridge正則化可能糾正了兩個特征之間的協(xié)方差問題。當我們用其他模型的形式將我們的數(shù)據(jù)分析推進的同時,我們可以繼續(xù)visualizers來快速比較并且可視化我們的結(jié)果。
希望這個流程讓你對怎樣將Visualizers通過Scikit-Learn整合到機器學習中去有一個概念,并且給你啟發(fā)讓你將其運用到你的工作中!如果想要了解更多的有關(guān)怎樣開始使用Yellowbrick的信息,請查看 模型選擇教程 。然后你就在 Visualizers and API 上快速查看更多的特定visualizers了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
