背景介紹

從學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了。