Python应用实战-如何使用Plotly绘制精美图形?
Plotly 是一款用來做數(shù)據(jù)分析和可視化的在線平臺,功能非常強大,可以在線繪制很多圖形比如條形圖、散點圖、餅圖、直方圖等等。而且還是支持在線編輯,以及多種語言python、javascript、matlab、R等許多API。
Plotly在Python中使用也很簡單,直接用pip install plotly就可以了。推薦最好在Jupyter notebook中使用,Pycharm操作不是很方便。
Plotly的圖表多樣化且專業(yè)化,可以繪制很多專業(yè)學(xué)科領(lǐng)域的圖表。下面是官網(wǎng)的幾種劃分。
基本圖表
基礎(chǔ)圖表
統(tǒng)計圖
科學(xué)圖
金融圖表
地圖
3D圖表
多子圖
與Jupyter交互圖
添加自定義控件
人工智能與機(jī)器學(xué)習(xí)圖
本文主要深入探討poltly與機(jī)器學(xué)習(xí)結(jié)合,繪制機(jī)器學(xué)習(xí)相關(guān)圖。??
?
Plotly Express 回歸
這里我們將一起學(xué)習(xí)如何使用plotly圖表來顯示各種類型的回歸模型,從簡單的模型如線性回歸,到其他機(jī)器學(xué)習(xí)模型如決策樹和多項式回歸。
重點學(xué)習(xí)plotly的各種功能,如使用不同參數(shù)對同一模型進(jìn)行比較分析、Latex顯示、3D表面圖,以及使用plotly Express進(jìn)行增強的預(yù)測誤差分析。
Plotly Express 簡介
Plotly Express?是plotly的易于使用的高級界面,可處理多種類型的數(shù)據(jù)并生成易于樣式化的圖形。
通過Plotly Express?可以將普通最小二乘回歸趨勢線添加到帶有trendline參數(shù)的散點圖中。為此需要安裝statsmodels及其依賴項。
基礎(chǔ)圖形: scatter, line, area, bar, funnel, timeline
部分到整體圖表: pie, sunburst, treemap, funnel_area
一維分布圖: histogram, box, violin, strip
二維分布圖: density_heatmap, density_contour
矩陣的輸入圖: imshow
三維圖: scatter_3d, line_3d
多維圖: scatter_matrix, parallel_coordinates, parallel_categories
平鋪地圖: scatter_mapbox, line_mapbox, choropleth_mapbox, density_mapbox
離線地圖: scatter_geo, line_geo, choropleth
極坐標(biāo)圖: scatter_polar, line_polar, bar_polar
三元圖: scatter_ternary, line_ternary
普通最小二乘回歸可視化
將線性普通最小二乘(OLS)回歸趨勢線或非線性局部加權(quán)散點圖平滑(LOWESS)趨勢線添加到Python中的散點圖。將鼠標(biāo)懸停在趨勢線上將顯示該線的方程式及其R平方值,非常方便。
單線擬合
與seaborn類似,plotly圖表主題不需要單獨設(shè)置,使用默認(rèn)參數(shù)即可滿足正常情況下的使用,因此一行代碼并設(shè)置參數(shù)trendline="ols"即可搞定散點圖與擬合線的繪制,非常方便。
import?plotly.express?as?px fig=px.scatter(df,?x="open",?y="close",?trendline="ols") fig.show()多線擬合
同樣,在繪制多個變量及多個子圖時,也不需要設(shè)置多畫布,只要設(shè)置好參數(shù)?'x','y','facet_col','color'?即可。
fig=px.scatter(df,?x="open",?y="close",?facet_col="Increase_Decrease",?color="Up_Down",?trendline="ols") fig.show()查看擬合結(jié)果
繪圖后,需要查看具體的各項統(tǒng)計學(xué)數(shù)據(jù),可以通過get_trendline_results方法,具體代碼與結(jié)果如下。
results?=?px.get_trendline_results(fig) results.query("Up_Down?==?'Up'?and?Increase_Decrease?==?'1'").px_fit_results.iloc[0].summary()非線性回歸可視化
非線性回歸擬合是通過設(shè)置參數(shù)trendline="lowess"來實現(xiàn),Lowess是指局部加權(quán)線性回歸,它是一種非參數(shù)回歸擬合的方式。
fig?=?px.scatter(df2,?x="date",?y="open",?color="Increase_Decrease",?trendline="lowess") fig.show()Sklearn與Plotly組合
Scikit-learn是一個流行的機(jī)器學(xué)習(xí)(ML)庫,它提供了各種工具,用于創(chuàng)建和訓(xùn)練機(jī)器學(xué)習(xí)算法、特征工程、數(shù)據(jù)清理以及評估和測試模型。
這里使用Scikit-learn來分割和預(yù)處理我們的數(shù)據(jù),并訓(xùn)練各種回歸模型。
線性回歸可視化
可以使用Scikit-learn的線性回歸執(zhí)行相同的預(yù)測。與直接用plotly.express擬合普通最小二乘回歸不同,這是通過散點圖和擬合線組合的方式繪制圖形,這會更加靈活,除了添加普通線性回歸擬合曲線,還可以組合其他線性回歸曲線,即將擬合結(jié)果很好地可視化出來。
import?plotly.graph_objects?as?go from?sklearn.linear_model?import?LinearRegression X?=?df.open.values.reshape(-1,?1) #?回歸模型訓(xùn)練 model?=?LinearRegression() model.fit(X,?df.close) #?生產(chǎn)預(yù)測點 x_range?=?np.linspace(X.min(),?X.max(),?100) y_range?=?model.predict(x_range.reshape(-1,?1)) #?圖形繪制 fig?=?px.scatter(df,?x='open',?y='close',?opacity=0.65) fig.add_traces(go.Scatter(x=x_range,?y=y_range,?name='Regression?Fit')) fig.show()模型泛化能力可視化
利用plotly可視化查看模型泛化能力,即需要比較模型分別在訓(xùn)練集與測試集上的擬合狀況。這里使用Scatter繪圖,可以通過用不同的顏色著色訓(xùn)練和測試數(shù)據(jù)點,將訓(xùn)練集與測試集數(shù)據(jù)及擬合線繪制在同一張畫布上,即可很容易地看到模型是否能很好地擬合測試數(shù)據(jù)。
KNN回歸可視化
KNN回歸的原理是從訓(xùn)練樣本中找到與新點在距離上最近的預(yù)定數(shù)量的幾個點,并從這些點中預(yù)測標(biāo)簽。
KNN回歸的一個簡單的實現(xiàn)是計算最近鄰K的數(shù)值目標(biāo)的平均值。另一種方法是使用K近鄰的逆距離加權(quán)平均值。
from?sklearn.neighbors?import?KNeighborsRegressor #?數(shù)據(jù)準(zhǔn)備 X?=?df2.open.values.reshape(-1,?1) x_range?=?np.linspace(X.min(),?X.max(),?100) #?模型訓(xùn)練,weights='distance'及weights='uniform' knn_dist?=?KNeighborsRegressor(10,?weights='distance') knn_dist.fit(X,?df2.Returns) y_dist?=?knn_dist.predict(x_range.reshape(-1,?1)) #?繪制散點圖及擬合曲線 fig?=?px.scatter(df2,?x='open',?y='Returns',?color='Up_Down',?opacity=0.65) fig.add_traces(go.Scatter(x=x_range,?y=y_uni,?name='Weights:?Uniform')) #?'Weights:?Distance' fig.show()多項式回歸可視化
線性回歸是如何擬合直線的,而KNN可以呈現(xiàn)非線性的形狀。除此之外,還可以通過使用scikit-learn的多項式特征為特征的n次冪擬合一個斜率,將線性回歸擴(kuò)展到多項式回歸。
使用Plotly,只需在方程前后添加$符號,就可以在圖例和標(biāo)題中使用$\LaTeX$顯示擬合方程,即你可以看到多項式回歸擬合的系數(shù)。
#?定義圖例中多項式方程函數(shù) def?format_coefs(coefs):equation_list?=?[f"{coef}x^{i}"?for?i,?coef?in?enumerate(coefs)]equation?=?"$"?+??"?+?".join(equation_list)?+?"$"replace_map?=?{"x^0":?"",?"x^1":?"x",?'+?-':?'-?'}for?old,?new?in?replace_map.items():equation?=?equation.replace(old,?new)return?equation #?繪制散點圖 fig?=?px.scatter(df,?x='open',?y='High_Low',?opacity=0.65) #?利用循環(huán)方式繪制多項式擬合曲線 fig.add_traces(go.Scatter(x=x_range.squeeze(),?y=y_poly,?name=equation))3D圖繪制支持向量機(jī)決策邊界
二維平面中,當(dāng)類標(biāo)簽給出時,可以使用散點圖考察兩個屬性將類分開的程度。即用一條直線或者更復(fù)雜的曲線,將兩個屬性定義的平面分成區(qū)域,每個區(qū)域包含一個類的大部分對象,則可能基于這對指定的屬性構(gòu)造精確的分類器,如用于二分類的邏輯回歸。
而在更高維度中,即當(dāng)輸入數(shù)據(jù)中有多個變量時,分類器可以是支持向量機(jī)(SVM),其通過在高維空間中尋找決策邊界以區(qū)分不同類別標(biāo)簽。如在三維空間中可以通3D圖內(nèi)的曲線來可視化模型的決策平面。
在Plotly中可以利用px.scatter_3d?和go.Surface繪制3D圖。
from?sklearn.svm?import?SVR #?建立模型 model?=?SVR(C=1.) model.fit(X,?y) #?使用模型預(yù)測 pred?=?model.predict(np.c_[xx.ravel(),?yy.ravel()]) pred?=?pred.reshape(xx.shape) #?繪圖 fig?=?px.scatter_3d(df,?x='sepal_length',?y='sepal_width',?z='petal_width') fig.update_traces(marker=dict(size=5)) fig.add_traces(go.Surface(x=xrange,?y=yrange,?z=pred,?name='pred_surface'))多元線性回歸可視化
本節(jié)介紹用plotly可視化多元線性回歸(MLR)的系數(shù)。
用一個或兩個變量可視化回歸是很簡單的,因為可以分別用散點圖和3D散點圖來繪制它們。但如果有兩個以上的特性,則需要找到其他方法來可視化數(shù)據(jù)。
一種方法是使用條形圖。下面列子中每個條形圖表示每個輸入特征的線性回歸模型的系數(shù)。柱狀圖等大小代表線性回歸系數(shù)的大小,負(fù)相關(guān)與正相關(guān)分別用紅色與藍(lán)色區(qū)分,特別顯目。
X?=?df.loc[:,['open',?'close','volume',?'Increase_Decrease']] X?=?pd.get_dummies(X,?columns=['Increase_Decrease'],?prefix_sep='=') y?=?df['Returns'] #?模型訓(xùn)練 model?=?LinearRegression() model.fit(X,?y) #?繪制柱狀圖 fig?=?px.bar(x=X.columns,?y=model.coef_,?color=colors,color_discrete_sequence=['red',?'blue'],labels=dict(x='Feature',?y='Linear?coefficient'),title='Weight?of?each?feature?for?predicting?Returns' ) fig.show()實際點與預(yù)測點的比較圖
這介紹了比較預(yù)測輸出與實際輸出的最簡單方法,即以真實值為x軸,以預(yù)測值為y值,繪制二維散點圖。從圖中看,若理論最優(yōu)擬合(黑色斜線)附近有大部分的散點則說明模型擬合效果很好。
y_pred?=?model.predict(X) #?繪制散點圖 fig?=?px.scatter(x=y,?y=y_pred,?labels={'x':?'ground?truth','y':?'prediction'}) #?繪制理論最優(yōu)擬合 fig.add_shape(?type="line",?line=dict(dash='dash'),x0=y.min(),?y0=y.min(),x1=y.max(),?y1=y.max()) fig.show()增強的預(yù)測誤差分析圖
通過添加邊緣直方圖來快速診斷模型可能存在的任何預(yù)測誤差。通過將模型與理論最優(yōu)擬合(黑色虛線)進(jìn)行比較,內(nèi)置的OLS功能可以可視化模型的泛化程度。
邊緣的直方圖表示在某個區(qū)間內(nèi),模型與理論最優(yōu)擬合之間的誤差值,不同的顏色代表不同的數(shù)據(jù)集。
model?=?LinearRegression() model.fit(X_train,?y_train) df['prediction']?=?model.predict(X) #?散點圖與擬合虛線 fig?=?px.scatter(df,?x='open',?y='prediction',marginal_x='histogram',?marginal_y='histogram',color='split',?trendline='ols') #?邊緣直方圖 fig.update_traces(histnorm='probability',?selector={'type':'histogram'}) #?理論最優(yōu)擬合?黑色虛線 fig.add_shape(type="line",?line=dict(dash='dash'),x0=y.min(),?y0=y.min(),x1=y.max(),?y1=y.max())殘差圖
就像預(yù)測誤差圖一樣,使用plotly很容易在幾行代碼中可視化預(yù)測殘差。即在常規(guī)的散點圖中設(shè)置預(yù)測參數(shù)trendline='ols'及預(yù)測殘差參數(shù)marginal_y='violin',并以小提琴的圖形展示出來。
#?模型訓(xùn)練 model?=?LinearRegression() model.fit(X_train,?y_train) #?模型預(yù)測 df['prediction']?=?model.predict(X) df['residual']?=?df['prediction']?-?df['close'] #?繪制散點圖和擬合線 fig?=?px.scatter(df,?x='prediction',?y='residual',marginal_y='violin',???#?設(shè)置殘差小提琴圖color='split',?trendline='ols') fig.show()交叉驗證可視化
交叉驗證是將訓(xùn)練數(shù)據(jù)再次分配,我們以5折為例,就是說將交叉數(shù)據(jù)分成五份,每次都選取不同的數(shù)據(jù)作為驗證數(shù)據(jù)。每一組不同的驗證數(shù)據(jù)都會得出一個準(zhǔn)確度,求得五組準(zhǔn)確度的平均值,就是某個參數(shù)情況下的準(zhǔn)確度。
Plotly可以使用Scikit-learn的LassoCV繪制交叉驗證結(jié)果中各種懲罰值的結(jié)果。
from?sklearn.linear_model?import?LassoCV N_FOLD?=?6 #?數(shù)據(jù)準(zhǔn)備 X?=?df.loc[:,['open',?'close',?'Open_Close',?'High_Low',?'volume',?'Increase_Decrease']] X?=?pd.get_dummies(X,?columns=['Increase_Decrease'],?prefix_sep='=') y?=?df['Returns'] #?模型訓(xùn)練 model?=?LassoCV(cv=N_FOLD,?normalize=True) model.fit(X,?y) mean_alphas?=?model.mse_path_.mean(axis=-1) #?繪制交叉驗證均方誤差曲線 fig?=?go.Figure([go.Scatter(x=model.alphas_,?y=model.mse_path_[:,?i],name=f"Fold:?{i+1}",?opacity=.5,?line=dict(dash='dash'),hovertemplate="alpha:?%{x}?<br>MSE:?%{y}")for?i?in?range(N_FOLD)]) #?添加交叉驗證的平均均方誤差 fig.add_traces(go.Scatter(x=model.alphas_,?y=mean_alphas,name='Mean',?line=dict(color='black',?width=3),hovertemplate="alpha:?%{x}?<br>MSE:?%{y}",)) fig.show()基于決策樹的網(wǎng)格搜索可視化
Scikit-learn機(jī)器學(xué)習(xí)中的GridSearchCV,即GridSearch和CV,網(wǎng)格搜索和交叉驗證。
網(wǎng)格搜索,搜索的是參數(shù),即在指定的參數(shù)范圍內(nèi),按步長依次調(diào)整參數(shù),利用調(diào)整的參數(shù)訓(xùn)練學(xué)習(xí)器,從所有的參數(shù)中找到在驗證集上精度最高的參數(shù),這其實是一個訓(xùn)練和比較的過程。
Plotly中運用px.density_heatmap?和?px.box,在DecisionTreeRegressor上將網(wǎng)格搜索過程可視化。
網(wǎng)格搜索調(diào)參
from?sklearn.model_selection?import?GridSearchCV from?sklearn.tree?import?DecisionTreeRegressorN_FOLD?=?6 X?=?df[['open',?'volume']] y?=?df['close'] #?定義與訓(xùn)練網(wǎng)格搜索 model?=?DecisionTreeRegressor() param_grid?=?{'criterion':?['mse',?'friedman_mse',?'mae'],'max_depth':?range(2,?5)} grid?=?GridSearchCV(model,?param_grid,?cv=N_FOLD) grid.fit(X,?y) grid_df?=?pd.DataFrame(grid.cv_results_) #?將網(wǎng)格的寬格式轉(zhuǎn)換為長格式單個函數(shù)調(diào)用來繪制每個圖形
第一個圖顯示了如何在單個分割(使用facet分組)上可視化每個模型參數(shù)的分?jǐn)?shù)。
每個大塊代表不同數(shù)據(jù)分割下,不同網(wǎng)格參數(shù)的R方和。而其中每個小塊代表相同數(shù)據(jù)分割下,網(wǎng)格參數(shù):'criterion'與'max_depth'在不同取值組合下的R方和。
fig_hmap?=?px.density_heatmap(melted,?x="max_depth",?y='criterion',histfunc="sum",?z="r_squared",title='Grid?search?results?on?individual?fold',hover_data=['mean_fit_time'],facet_col="cv_split",?facet_col_wrap=3,labels={'mean_test_score':?"mean_r_squared"}) fig_hmap.show()第二個圖匯總了所有分割的結(jié)果,每個盒子代表一個單一的模型。三組盒子代表三個不同的樹深度'max_depth',每組中不同顏色的盒子代表不同的評價標(biāo)準(zhǔn)'criterion'。
fig_box?=?px.box(melted,?x='max_depth',?y='r_squared',title='Grid?search?results?',hover_data=['mean_fit_time'],points='all',color="criterion",hover_name='cv_split',labels={'mean_test_score':?"mean_r_squared"}) fig_box.show()KNN分類可視化
訓(xùn)練一個 K-Nearest Neighbors 分類器,首先模型記錄每個訓(xùn)練樣本的標(biāo)簽。然后每當(dāng)給它一個新樣本時,它就會從訓(xùn)練集中找k個最接近的樣本來找到對應(yīng)的標(biāo)簽,然后做投票,看看這個區(qū)域內(nèi),哪個類別標(biāo)簽數(shù)量多,以確定標(biāo)簽值并把它賦給新樣本。
在圖中,將所有負(fù)標(biāo)簽顯示為正方形,正標(biāo)簽顯示為圓形。我們通過在測試數(shù)據(jù)中心添加一個點來區(qū)分訓(xùn)練集和測試集。
通過plotly中的dash還可以繪制交互圖,不同參數(shù)下不同的決策邊界,無疑給我們理解模型提供了一個很好的幫手。具體繪圖過程可以到官網(wǎng)查看,這里不做過多的介紹。
模型評價可視化
這里的模型評價主要針對分類模型,回歸模型用擬合誤差、擬合殘差等可以評價回歸模型的優(yōu)劣,前面已經(jīng)介紹過了。此處主要是將模型的預(yù)測概率、模型效果可視化,如假正率真正率曲線圖、繪制ROC曲線圖等。
與真實標(biāo)簽相比的分?jǐn)?shù)直方圖
from?sklearn.metrics?import?roc_curve,?auc #?二分類邏輯回歸建模 model?=?LogisticRegression() model.fit(X,?y) #?模型預(yù)測概率 y_score?=?model.predict_proba(X)[:,?1] #?繪制預(yù)測概率直方圖 fig_hist?=?px.histogram(x=y_score,?color=y,?nbins=30,labels=dict(color='True?Labels',?x='Score')) fig_hist.show()在不同的閾值下評估模型性能
#?計算ROC曲線各個值 fpr,?tpr,?thresholds?=?roc_curve(y,?y_score) #?建立閾值數(shù)據(jù)框 df?=?pd.DataFrame({'False?Positive?Rate':?fpr,'True?Positive?Rate':?tpr},?index=thresholds) df.index.name?=?"Thresholds" df.columns.name?=?"Rate" #?繪制折線圖 fig_thresh?=?px.line(df,?title='TPR?and?FPR?at?every?threshold',width=500,?height=500) #?設(shè)置x/y軸 fig_thresh.update_yaxes(scaleanchor="x",?scaleratio=1) fig_thresh.update_xaxes(range=[0.2,?1],?constrain='domain') fig_thresh.show() #?繪制面積圖 fig?=?px.area(x=fpr,?y=tpr,title=f'ROC?Curve?(AUC={auc(fpr,?tpr):.4f})',labels=dict(x='False?Positive?Rate',?y='True?Positive?Rate'),width=700,?height=500) #?添加理論線?黑色虛線 fig.add_shape(type='line',?line=dict(dash='dash'),x0=0,?x1=1,?y0=0,?y1=1) #?更新圖表樣式 fig.update_yaxes(scaleanchor="x",?scaleratio=1) fig.update_xaxes(constrain='domain') fig.show()總結(jié)
以上是生活随笔為你收集整理的Python应用实战-如何使用Plotly绘制精美图形?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python应用实战-Pandas 计算
- 下一篇: Python应用实战-如何用Pyecha