>加入極市CV技術交流群,走在計算機視..." />
<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          機器學習 pipeline 的可視化

          共 12657字,需瀏覽 26分鐘

           ·

          2020-10-19 16:27

          t↑ 點擊藍字?關注極市平臺

          作者丨Pier Paolo Ippolito、McGL(譯)
          來源丨PyVision
          編輯丨極市平臺

          極市導讀

          ?

          本文集合了多個有趣的技術,可用于機器學習pipeline不同部分的可視化。>>加入極市CV技術交流群,走在計算機視覺的最前沿


          引言


          作為任何數據科學項目的一部分,數據可視化在理解更多可用數據和識別任何主要模式方面發(fā)揮著重要作用。
          如果有可能使分析中的機器學習部分盡可能直觀,那不是很好嗎?
          在本文中,我們將探索一些技術,可以幫助我們面對這一挑戰(zhàn),如: 平行坐標圖,摘要數據表,繪制人工神經網絡圖等等。?

          本文中使用的所有代碼都可以在我的 Github (pierpaolo28/Data-Visualization)上免費獲得。

          技巧

          超參數優(yōu)化

          超參數優(yōu)化是機器/深度學習中最常見的動作之一。機器學習模型的調優(yōu)是最佳化問題的一種。我們有一組超參數(例如:學習率,隱藏單元的數量,等等......)我們的目標是找出他們的值的正確組合,這可以幫助我們得到最小值(如損失)或最高值(如函數的準確性)。?

          此類任務的最佳解決方案之一是使用平行坐標圖(parallel coordinates plot)(圖1)。使用這種類型的圖,我們可以很容易地一起比較不同的變量(例如特征),以發(fā)現可能的關系。在超參數優(yōu)化的情況下,這可以作為一個簡單的工具來檢查什么樣的參數組合可以給我們提供最大的測試精度。數據分析中平行坐標圖的另一個可能用途是檢查數據幀中不同特征之間的值之間的關系。?

          import plotly.express as px
          fig = px.parallel_coordinates(df2, color="mean_test_score", labels=dict(zip(list(df2.columns), list(['_'.join(i.split('_')[1:]) for i in df2.columns]))), color_continuous_scale=px.colors.diverging.Tealrose, color_continuous_midpoint=27)
          fig.show()


          圖1: 平行坐標超參數優(yōu)化圖
          為了在 Python 中創(chuàng)建平行坐標圖,可以使用不同的技術,如 Pandas、 Yellowbrick、 Matplotlib 或 Plotly。使用所有這些不同方法的一步一步解釋的例子都可以在我的 notebook 鏈接中找到:

          https://www.kaggle.com/pierpaolo28/parallel-coordinates-plots?scriptVersionId=35973765

          最后,另一個可以用來創(chuàng)建這種類型的圖的解決方案是Weights & Biases Sweeps。Weights & Biases是一個免費的工具,可以用來自動創(chuàng)建不同的機器學習任務(如學習率曲線,圖模型等等)的圖和日志。個人和團體都適用。

          Data Wrapper

          Data Wrapper是一個免費的在線工具,專為創(chuàng)建專業(yè)圖表設計。例如,這個工具被《紐約時報》、 Vox 和《連線》等雜志的文章所使用。不需要登錄,所有的過程都可以在線完成。今年這個工具額外創(chuàng)建了一個 Python wrapper,可以使用以下方法輕松安裝:
          pip install datawrapper

          為了使用 Python API,我們還需要注冊 Data Wrapper,進入設置并創(chuàng)建一個 API Key。使用這個 API 鍵,我們就可以遠程使用Data Wrapper。?

          現在,我們可以很容易地創(chuàng)建一個條形圖,例如,通過以下幾行代碼,并傳遞一個 Pandas 數據幀作為?create _ chart?函數的輸入。
          from datawrapper import Datawrapperdw = Datawrapper(access_token = "TODO")games_chart = dw.create_chart(title = "Most Frequent Game Publishers", chart_type = 'd3-bars', data = df)dw.update_description( games_chart['id'], source_name = 'Video Game Sales', source_url = 'https://www.kaggle.com/gregorut/videogamesales', byline = 'Pier Paolo Ippolito',)dw.publish_chart(games_chart['id'])

          得到的圖表如下所示。

          一旦我們的圖表發(fā)布了,我們就可以在我們的 Data Wrapper 帳戶的創(chuàng)建的圖表列表中找到它。點擊我們的圖表,然后我們會找到一個不同選項的列表,我們可以使用以便輕松地共享我們的圖表(例如:嵌入,HTML,PNG,等等)。

          Plotly預測表

          在處理時間序列數據時,有時如果能夠快速理解我們的模型在哪些數據點上表現不佳真的很方便,這樣可以嘗試理解它可能面臨的限制。?

          一種可能的方法是創(chuàng)建一個匯總表,其中包括實際值和預測值,以及某種形式的度量,用于總結一個數據點的預測好壞。?

          使用 Plotly,可以通過創(chuàng)建一個繪圖函數輕松實現:
          import chart_studio.plotly as pyimport plotly.graph_objs as gofrom plotly.offline import init_notebook_mode, iplotinit_notebook_mode(connected=True)import plotlydef predreport(y_pred, Y_Test): diff = y_pred.flatten() - Y_Test.flatten() perc = (abs(diff)/y_pred.flatten())*100 priority = [] for i in perc: if i > 0.4: priority.append(3) elif i> 0.1: priority.append(2) else: priority.append(1) print("Error Importance 1 reported in ", priority.count(1), "cases\n") print("Error Importance 2 reported in", priority.count(2), "cases\n") print("Error Importance 3 reported in ", priority.count(3), "cases\n") colors = ['rgb(102, 153, 255)','rgb(0, 255, 0)', 'rgb(255, 153, 51)', 'rgb(255, 51, 0)'] fig = go.Figure(data=[go.Table(header= dict( values=['Actual Values', 'Predictions', '% Difference', "Error Importance"], line_color=[np.array(colors)[0]], fill_color=[np.array(colors)[0]], align='left'), cells=dict( values=[y_pred.flatten(),Y_Test.flatten(), perc, priority], line_color=[np.array(colors)[priority]], fill_color=[np.array(colors)[priority]], align='left'))]) init_notebook_mode(connected=False) py.plot(fig, filename = 'Predictions_Table', auto_open=True) fig.show()

          然后調用這個函數會得到以下輸出(請隨意測試圖3中的表) :
          Error Importance 1 reported in 34 cases
          Error Importance 2 reported in 13 cases
          Error Importance 3 reported in 53 cases
          圖3: 預測表

          決策樹

          決策樹是機器學習模型中最容易解釋的類型之一。由于它們的基本結構,很容易通過查看樹的不同分支的條件來檢查算法是如何決定的。此外,決策樹也可以作為一種特征選擇技術,考慮到算法將那些對我們期望的分類/回歸任務最有價值的特征置于樹的頂層。通過這種方式,樹底部的特征可以被丟棄,因為它攜帶的信息更少。?

          可視化分類/回歸決策樹的最簡單方法之一是使用?sklearn.tree?中的?export_graphviz。在本文中,使用了 dtreevz 庫提供的一種不同的、更完整的方法。

          使用這個庫,只需使用以下幾行代碼就可以創(chuàng)建一個分類決策樹:
          from dtreeviz.trees import *
          viz = dtreeviz(clf, X_train, y_train.values, target_name='Genre', feature_names=list(X.columns), class_names=list(labels.unique()), histtype='bar', orientation ='TD')
          viz

          得到的繪圖如圖4所示。

          圖4: 分類決策樹
          在圖4中,不同的類用不同的顏色表示。所有不同類的特征分布都表示在樹的起始節(jié)點上。只要我們向下移動每個分支,算法就會嘗試使用每個節(jié)點圖下面描述的特征最好地分離不同的分布。沿著分布生成的圓表示在跟隨某個節(jié)點后正確分類的元素數量,元素數量越大,圓的大小就越大。?

          圖5展示了一個使用決策樹回歸器的例子。

          圖5: 決策樹回歸器

          決策邊界

          決策邊界是圖形化地理解機器學習模型如何進行預測的最簡單方法之一。在 Python 中繪制決策邊界的最簡單方法之一是使用 Mlxtend。這個庫實際上可以用來繪制機器學習和深度學習模型的決策邊界。圖6顯示了一個簡單的例子。
          from mlxtend.plotting import plot_decision_regions import matplotlib.pyplot as pltimport matplotlib.gridspec as gridspecimport itertoolsgs = gridspec.GridSpec(2, 2)
          fig = plt.figure(figsize=(10,8))
          clf1 = LogisticRegression(random_state=1, solver='newton-cg', multi_class='multinomial')clf2 = RandomForestClassifier(random_state=1, n_estimators=100)clf3 = GaussianNB()clf4 = SVC(gamma='auto')
          labels = ['Logistic Regression','Random Forest','Naive Bayes','SVM']for clf, lab, grd in zip([clf1, clf2, clf3, clf4], labels, itertools.product([0, 1], repeat=2)):
          clf.fit(X_Train, Y_Train) ax = plt.subplot(gs[grd[0], grd[1]]) fig = plot_decision_regions(X_Train, Y_Train, clf=clf, legend=2) plt.title(lab)
          plt.show()

          圖6: 繪制決策邊界
          Mlxtend 的一些可能的替代方案是: Yellowbrick、 Plotly 或者一個普通的 Sklearn 和 Numpy 實現。使用所有這些不同方法的一步一步的例子都可以在我的notebook的這個鏈接(Machine Learning Visualization 5)中找到。

          此外,在訓練期間的決策邊界融合的不同的動畫版本可在我的網站上的這個鏈接(Animated Training ML Model)看到。?

          制決策邊界的一個主要局限性是它們只能在二維或三維空間中很容易地可視化。由于這些限制,因此在繪制決策邊界圖之前,大多數時候可能需要降低輸入特征的維數(使用某種形式的特征提取技術)。


          人工神經網絡

          另一個技術,在創(chuàng)建新的神經網絡架構時可視化他們的結構是非常有用的。使用 ANN Visualiser 可以很容易地做到這一點(圖7)。
          from keras.models import Sequentialfrom keras.layers import Densefrom ann_visualizer.visualize import ann_viz
          model = Sequential()model.add(Dense(units=4,activation='relu', input_dim=7))model.add(Dense(units=4,activation='sigmoid'))model.add(Dense(units=2,activation='relu'))
          ann_viz(model, view=True, filename="example", title="Example ANN")


          圖7: ANN圖
          Livelossplot


          在訓練和驗證過程中,能夠自動繪制實時神經網絡的損失和準確率,對于即時了解網絡是否隨著時間的推移而取得進展有很大幫助。使用 Livelossplot可以很容易地做到這點。?

          在圖8中,是一個在 Pytorch 中訓練一個變分自動編碼器(VAE)時實時創(chuàng)建的損失圖的例子。


          圖8: 實時VAE訓練

          使用 Livelossplot,可以很容易地通過存儲我們想要記錄的所有指標在字典中,并在每次迭代結束時更新圖表來實現。如果我們有興趣創(chuàng)建多個圖形(例如:一個是損失,另一個是整體的準確率)。
          from livelossplot import PlotLossesliveloss = PlotLosses()for epoch in range(epochs): logs = {} for phase in ['train', 'val']: losses = []
          if phase == 'train': model.train() else: model.eval()
          for i, (inp, _) in enumerate(dataloaders[phase]): out, z_mu, z_var = model(inp) rec=F.binary_cross_entropy(out,inp,reduction='sum')/ inp.shape[0] kl=-0.5*torch.mean(1+z_var-z_mu.pow(2)-torch.exp(z_mu)) loss = rec + kl losses.append(loss.item())
          if phase == 'train': optimizer.zero_grad() loss.backward() optimizer.step()
          prefix = '' if phase == 'val': prefix = 'val_' logs[prefix + 'loss'] = np.mean(losses) liveloss.update(logs) liveloss.send()
          Livelossplot 還可以與其他庫如 Keras,Pytorch-Lighting,Bokeh 等一起使用。

          變分自動編碼器

          變分自動編碼器(VAE)是一種用于創(chuàng)建一些輸入數據的潛在表示的概率生成模型(如圖片),這種表示能夠簡明地理解原始數據并從中生成全新的數據(例如用不同形象的汽車設計訓練 VAE 模型,然后可以使模型創(chuàng)造全新的想象的汽車設計)。?

          繼續(xù)從使用 Livelossplot 訓練的變分 Autoencoder 示例,我們甚至可以通過檢查潛在空間(圖9)如何從一個迭代變化到另一個迭代(即我們的模型隨著時間的推移改進了多少,以區(qū)分不同的類) ,使我們的模型更有趣。?

          這可以很容易地通過在前面的訓練循環(huán)中添加以下函數來實現:
          def latent_space(model, train_set, it=''): x_latent = model.enc(train_set.data.float()) plt.figure(figsize=(10, 7)) plt.scatter(x_latent[0][:,0].detach().numpy(), x_latent[1][:,1].detach().numpy(), c=train_set.targets) plt.colorbar() plt.title("VAE Latent Space", fontsize=20) plt.xlabel("X", fontsize=18) plt.ylabel("Y", fontsize=18) plt.savefig('VAE_space'+str(it)+'.png', format='png', dpi=200) plt.show()


          圖9: VAE潛在空間進化
          最后,一個類似的過程可以被應用,來實時可視化我們的 VAE 如何從迭代到迭代改進生成真實的圖像(圖10)。
          def manifold(model, it='', n=18, size=28): result = torch.zeros((size * n, size * n)) # Defyining grid space s, s2 = torch.linspace(-7, 7, n), torch.linspace(7, -7, n) grid_x, grid_y = torch.std(s)*s, torch.std(s2)*s2 for i, y_ex in enumerate(grid_x): for j, x_ex in enumerate(grid_y): z_sample = torch.repeat_interleave(torch.tensor([ [x_ex, y_ex]]),repeats=batch_size, dim=0) x_dec = model.dec(z_sample) element = x_dec[0].reshape(size, size).detach() result[i * size: (i + 1) * size, j * size: (j + 1) * size] = element plt.figure(figsize=(12, 12)) plt.title("VAE Samples", fontsize=20) plt.xlabel("X", fontsize=18) plt.ylabel("Y", fontsize=18) plt.imshow(result, cmap='Greys') plt.savefig('VAE'+str(it)+'.png', format='png', dpi=300) plt.show()


          圖10: ?VAE 漸漸改進生成新的數字
          我個人網站有一個使用 ONNX 在線部署的變分自動編碼器的實際演示,可以實時進行推理。鏈接:

          https://pierpaolo28.github.io/Projects/ONNX/home.html?fbclid=IwAR13tKnQFfobSq4udV-N9FMfFZ6wUmAvU7GVn5yl0Cj4ttOw3uyl6TNNbMw

          Word Embeddings

          神經網絡 Embeddings 是為了學習如何將某種形式的類別數據轉換為數值數據而設計的一類神經網絡。與使用其他技術(如 One Hot Encoding)相比,使用 Embeddings 可能有相當大的優(yōu)勢,因為在轉換數據時,它們能夠了解數據的特征,從而構建一個更簡潔的表示(創(chuàng)建一個潛在空間)。最著名的兩種預訓練的 word embeddings 是 word2vec 和 Glove。?

          一個簡單的例子,我們現在要繪制一個代表不同圖書作者的 embed 空間。首先,我們需要在一些可用的數據上創(chuàng)建一個訓練模型,然后訪問模型 ?embedded 層(在這種情況下稱為embed)的訓練權重,并將它們存儲在一個數據幀中。完成這個過程后,我們只需繪制三個不同的坐標(圖11)。
          import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import axes3d, Axes3Dembedding_weights=pd.DataFrame(model.embed.weight.detach().numpy())embedding_weights.columns = ['X1','X2','X3']fig = plt.figure(num=None, figsize=(14, 12), dpi=80, facecolor='w', edgecolor='k')ax = plt.axes(projection='3d')for index, (x, y, z) in enumerate(zip(embedding_weights['X1'], embedding_weights['X2'], embedding_weights['X3'])): ax.scatter(x, y, z, color='b', s=12) ax.text(x, y, z, str(df.authors[index]), size=12, zorder=2.5, color='k')ax.set_title("Word Embedding", fontsize=20)ax.set_xlabel("X1", fontsize=20)ax.set_ylabel("X2", fontsize=20)ax.set_zlabel("X3", fontsize=20)plt.show()

          在這個例子中,網絡的 embedding 維數被直接設置為3,以便于創(chuàng)建三維可視化。另一種可能的解決方案可能是使用較高的 embedding 輸出大小,然后應用某種形式的特征提取技術(例如t-SNE,PCA 等)以便觀察結果。?

          另一個可以用來可視化分類數據的有趣技術是 Wordclouds (圖12)。例如,這種類型的表示可以通過創(chuàng)建一個圖書作者名字的字典以及在數據集中他們各自的頻率計數來實現。然后,在數據集中出現得更頻繁的作者將用更大的字體大小在圖中表示。
          from wordcloud import WordCloudd = {}for x, a in zip(df.authors.value_counts(), df.authors.value_counts().index): d[a] = xwordcloud = WordCloud()wordcloud.generate_from_frequencies(frequencies=d)plt.figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')plt.imshow(wordcloud, interpolation="bilinear")plt.axis("off")plt.title("Word Cloud", fontsize=20)plt.show()


          圖12: Wordcloud 例子
          像往常一樣,完整的代碼可以在我的 Github (pierpaolo28/Data-Visualization)上找到。

          可解釋的人工智能

          可解釋的人工智能如今是一個不斷發(fā)展的研究領域。在決策應用(如就業(yè))中使用人工智能最近引起了個人和當局的一些關注。這是因為,在使用深度神經網絡時,目前還不可能(至少在很大程度上)理解算法在執(zhí)行預定任務時執(zhí)行的決策過程。由于決策過程缺乏透明度,公眾可能會對模型本身的可信度感到困惑。因此,為了防止人工智能模型中出現任何形式的偏見,對可解釋人工智能的需求正在成為下一個確定的進化步驟。在過去的幾年中,不同的可視化技術被引入,以使機器學習更加易于理解,例如:

          • 卷積神經網絡濾波器和特征圖的研究

          • 圖網絡

          • 基于貝葉斯的模型

          • 因果推理應用于機器學習

          • 本地/全局代理模型

          • 引入局部可解釋模型-無關解釋(LIME)和 Shapley 值


          如果你對如何使機器學習模型更加易于理解感興趣,目前在 Python 中為了將可解釋的人工智能應用到深度學習中,兩個最有趣的庫是 Pytorch的Captum 和 XAI。?

          由于這個研究領域正在不斷改進,我將在未來的一篇專門討論可解釋人工智能的文章中涵蓋所有這些不同的主題(甚至更多)。


          如果你有興趣了解更多的機器學習可視化技術,Python Yellowbrick 庫正是聚焦這個話題。提供的可視化工具包括: 特征排序、 ROC/AUC 曲線、 K-Elbow 圖和各種文本可視化技術。?

          最后,在過去的幾年里,為了使機器學習的可視化更加容易,不同的框架已經開始進化了,比如 TensorBoard,Weights & Biases 和 Neptune.ai。

          希望你喜歡這篇文章,謝謝你的閱讀!

          來源鏈接:
          https://towardsdatascience.com/machine-learning-visualization-fcc39a1e376a

          推薦閱讀



          ?ACCV 2020國際細粒度網絡圖像識別競賽正式開賽!



          添加極市小助手微信(ID : cvmart2),備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳),即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術交流群:月大咖直播分享、真實項目需求對接、求職內推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~

          △長按添加極市小助手

          △長按關注極市平臺,獲取最新CV干貨

          覺得有用麻煩給個在看啦~??


          瀏覽 126
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久亚洲AV成人网址老师板 | 国精产品秘 成人一区二视频 | 9.1豆花免费网站亚洲天堂 | 麻豆国产精品一区 | 欧美性精品 |