# 背景介紹 從學sklearn時,除了演算法的坎要過,還得學習matplotlib可視化,對我的實踐應用而言,可視化更重要一些,然而matplotlib的易用性和美觀性確實不敢恭維。陸續使用過plotly、seaborn,最終定格在了Bokeh,因為它可以與Flask完美的結合,數據看板的開發難度降 ...
# 背景介紹 從學sklearn時,除了演算法的坎要過,還得學習matplotlib可視化,對我的實踐應用而言,可視化更重要一些,然而matplotlib的易用性和美觀性確實不敢恭維。陸續使用過plotly、seaborn,最終定格在了Bokeh,因為它可以與Flask完美的結合,數據看板的開發難度降低了很多。 前陣子看到這個庫可以較為便捷的實現數據探索,今天得空打算學習一下。原本訪問的是英文文檔,結果發現已經有人在做漢化,雖然看起來也像是谷歌翻譯的,本著拿來主義,少費點精力的精神,就半抄半學,還是發現了一些與文檔不太一致的地方。 ```python # http://www.scikit-yb.org/zh/latest/quickstart.html # http://www.scikit-yb.org/en/latest/quickstart.html ``` ```python 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"] ``` ```python 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格式 ``` ![file](https://img2018.cnblogs.com/blog/816924/201908/816924-20190820161831349-565028432.jpg) 由上圖可以看出特征向量7、8為強相關;0、1相關係數也比較高。 下麵再來通過曲線擬合看看兩者的相關度。 ```python from yellowbrick.features import JointPlotVisualizer visualizer = JointPlotVisualizer(feature='temp', target='feelslike') visualizer.fit(X['temp'], X['feelslike']) visualizer.poof() ``` ![file](https://img2018.cnblogs.com/blog/816924/201908/816924-20190820161831598-1738368309.jpg) JointPlotVisualizer 讓我們能快速瀏覽有強相關性的特征,以及各個特征的範圍和分佈情況。需要註意的是圖中的各個軸都已經標準化到0到1之間的值,這是機器學習中一中非常常用的減少一個特征對另一個影響的技術。 ```python 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() ``` ![file](https://img2018.cnblogs.com/blog/816924/201908/816924-20190820161831884-1916263666.jpg) 殘差圖還向我們展示了模型的誤差是怎麼產生的:那根加粗的水平線表示的是 residuals = 0 ,也就是沒有誤差;線上方或者下方的點則表示誤差值的大小。比如大部分殘差是負值,並且其值是由 actual - expected 算得,也就是說大部分時間預測值比實際值要大,比如和實際相比我們的模型總是預測有更多的騎手。| ```python import numpy as np from sklearn.linear_model import RidgeCV from yellowbrick.regressor import AlphaSelection # RidgeCV:多個阿爾法,得出多個對應最佳的w,然後得到最佳的w及對應的阿爾法 alphas = np.logspace(-10, 1, 200) visualizer = AlphaSelection(RidgeCV(alphas=alphas)) visualizer.fit(X, y) visualizer.poof() ``` ![file](https://img2018.cnblogs.com/blog/816924/201908/816924-20190820161832113-905205069.jpg) ```python alpha = visualizer.alpha_ visualizer.alpha_ ``` 3.612342699709438 在探索模型家族的過程中,第一個要考慮的是模型是怎樣變得更*複雜*的。當模型的複雜度增加,由於方差增加形成的誤差也相應增加,因為模型會變得過擬合併且不能泛化到未知數據上。然而,模型越簡單由於偏差造成的誤差就會越大;模型欠擬合,因此有更多的未中靶預測。大部分機器學習的目的就是要產生一個*複雜度適中*的模型,在偏差和方差之間找到一個中間點。 對一個線性模型來說,複雜度來自於特征本身以及根據模型賦予它們的值。因此對線性模型期望用*最少的特征*達到最好的闡釋結果。*正則化*是實現如上目標的其中一種技術,即引入一個alpha參數來對其相互之間繫數的權重進行標準化並且懲罰其複雜度。Alpha和複雜度之間是一個負相關。alpha值越大,複雜度越小,反之亦然。 我們現在可以訓練我們最終的模型並且用 PredictionError 對其進行可視化了: ```python 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() ``` ![file](https://img2018.cnblogs.com/blog/816924/201908/816924-20190820161832329-1656015226.jpg) 用預測誤差visualizer將實際(測量)值對期望(預測)值進行可視化。黑色的45度虛線表示誤差為0的點。和殘差圖一樣,這讓我們可以看到誤差在何處出現,值為多大。 在這個圖上,我們可以看到大部分的點集中在小於200騎手的位置。我們也許想要嘗試用正交匹配追蹤演算法(OMP)或者樣條(spline)來訓練一個將更多區域性考慮進來的回歸模型。我們還可以看到殘差圖中奇怪的拓撲結構好像已被Ridge回歸糾正,而且在我們的模型中大值和小值之間有了更多的平衡。Ridge正則化可能糾正了兩個特征之間的協方差問題。當我們用其他模型的形式將我們的數據分析推進的同時,我們可以繼續visualizers來快速比較並且可視化我們的結果。 希望這個流程讓你對怎樣將Visualizers通過Scikit-Learn整合到機器學習中去有一個概念,並且給你啟發讓你將其運用到你的工作中!如果想要瞭解更多的有關怎樣開始使用Yellowbrick的信息,請查看 模型選擇教程 。然後你就在 Visualizers and API 上快速查看更多的特定visualizers了。 ```python ```