Python視覺化神器Yellowbrick使用

視學演算法發表於2020-04-06

640?wx_fmt=jpeg


作者:沂水寒城,CSDN部落格專家,個人研究方向:機器學習、深度學習、NLP、CV

Blog: http://yishuihancheng.blog.csdn.net

在機器學習、資料探勘領域裡面,接觸到資料處理分析的人來說,資料探索是非常重要的一部分工作,而資料視覺化會成為資料分析工程師完成資料探索工作的有力工具。本文主要是介紹一款我日常使用較多的視覺化利器Yellowbrick,這是一款基於sklearn+matplotlib模組構建的更加高階的視覺化工具,能夠更加方便地完成很多資料探索、分詞與展示工作。

學習使用一個模組最好的方式就是學習它提供的API,下面先給出來幾個比較好的參考地址:

1)官方文件地址(英文)

https://www.scikit-yb.org/en/latest/

640?wx_fmt=png

2)官方文件地址(中文)

http://www.scikit-yb.org/zh/latest/

640?wx_fmt=png

Yellowbrick是由一套被稱為"Visualizers"組成的視覺化診斷工具組成的集合,其由Scikit-Learn API延伸而來,對模型選擇過程其指導作用。總之,Yellowbrick結合了Scikit-Learn和Matplotlib並且最好得傳承了Scikit-Learn文件,對你的模型進行視覺化!

想要了解Yellowbrick就必須先了解Visualizers,它是estimators從資料中學習得的物件,其主要任務是產生可對模型選擇過程有更深入瞭解的檢視。從Scikit-Learn來看,當視覺化資料空間或者封裝一個模型estimator時,其和轉換器(transformers)相似,就像"ModelCV" (比如RidgeCV,LassoCV)的工作原理一樣。Yellowbrick的主要目標是建立一個和Scikit-Learn類似的有意義的API。

Yellowbrick中最受歡迎的visualizers包括:

640?wx_fmt=png

如此強大的視覺化工具,安裝方式卻很簡單,使用下面的命令:

pip install yellowbrick

如果需要升級最新版本的則可以使用下面的命令:

pip install –u yellowbrick

安裝完成後,我們就可以進行使用了。該模組提供了幾個常用的可用於實驗使用的資料集,如下所示:

640?wx_fmt=png

進入到對應資料集資料夾下面,都會有三個檔案,對於bikeshare如下:

640?wx_fmt=png

其中:bikeshare.csv為資料集檔案,如:

640?wx_fmt=png

Meta.json為欄位元資訊檔案,如:

640?wx_fmt=png

README.md為介紹說明檔案,如:

640?wx_fmt=png

基於共享單車資料集,簡單的資料分析工作實現如下:

def testFunc5(savepath='Results/bikeshare_Rank2D.png'):
    '''
    共享單車資料集預測
    '''
    data=pd.read_csv('bikeshare/bikeshare.csv')
    X=data[["season", "month", "hour", "holiday", "weekday", "workingday",
            "weather", "temp", "feelslike", "humidity", "windspeed"
          ]]
    y=data["riders"]
    visualizer=Rank2D(algorithm="pearson")
    visualizer.fit_transform(X)
    visualizer.poof(outpath=savepath)


def testFunc6(savepath='Results/bikeshare_temperate_feelslike_relation.png'):
    '''
    進一步考察相關性
    '''
    data=pd.read_csv('bikeshare/bikeshare.csv')
    X=data[["season", "month", "hour", "holiday", "weekday", "workingday",
            "weather", "temp", "feelslike", "humidity", "windspeed"]]
    y=data["riders"]
    visualizer=JointPlotVisualizer(feature='temp', target='feelslike')
    visualizer.fit(X['temp'], X['feelslike'])
    visualizer.poof(outpath=savepath)


def testFunc7(savepath='Results/bikeshare_LinearRegression_ResidualsPlot.png'):
    '''
    基於共享單車資料使用線性迴歸模型預測
    '''
    data = pd.read_csv('bikeshare/bikeshare.csv')
    X=data[["season", "month", "hour", "holiday", "weekday", "workingday",
            "weather", "temp", "feelslike", "humidity", "windspeed"]]
    y=data["riders"]
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
    visualizer=ResidualsPlot(LinearRegression())
    visualizer.fit(X_train, y_train)
    visualizer.score(X_test, y_test)
    visualizer.poof(outpath=savepath)


def testFunc8(savepath='Results/bikeshare_RidgeCV_AlphaSelection.png'):
    '''
    基於共享單車資料使用AlphaSelection
    '''
    data=pd.read_csv('bikeshare/bikeshare.csv')
    X=data[["season", "month", "hour", "holiday", "weekday", "workingday",
            "weather", "temp", "feelslike", "humidity", "windspeed"]]
    y=data["riders"]
    alphas=np.logspace(-10, 1, 200)
    visualizer=AlphaSelection(RidgeCV(alphas=alphas))
    visualizer.fit(X, y)
    visualizer.poof(outpath=savepath)


def testFunc9(savepath='Results/bikeshare_Ridge_PredictionError.png'):
    '''
    基於共享單車資料繪製預測錯誤圖
    '''
    data=pd.read_csv('bikeshare/bikeshare.csv')
    X=data[["season", "month", "hour", "holiday", "weekday", "workingday",
            "weather", "temp", "feelslike", "humidity", "windspeed"]]
    y=data["riders"]
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
    visualizer=PredictionError(Ridge(alpha=3.181))
    visualizer.fit(X_train, y_train)
    visualizer.score(X_test, y_test)
    visualizer.poof(outpath=savepath)

bikeshare_Rank2D.png特徵相關性計算

640?wx_fmt=png

bikeshare_LinearRegression_ResidualsPlot.png使用線性迴歸模型預測

640?wx_fmt=png

bikeshare_RidgeCV_AlphaSelection.png使用AlphaSelection特徵選擇

640?wx_fmt=png

bikeshare_Ridge_PredictionError.png繪製預測錯誤圖

640?wx_fmt=png

除了可以直接對資料進行分析展示之外,Yellowbrick同樣可以對文字資料進行處理分析,下面我們基於愛好資料集進行簡單的使用說明,具體程式碼實現如下所示:

def hobbiesFreqDistVisualizer():
    '''
    文字視覺化
    Token 頻率分佈:繪製語料庫中令牌的頻率
    t-SNE 語料庫視覺化:繪製更接近發現聚類的類似文件
    '''
    corpus=load_corpus("data/hobbies")
    vectorizer = CountVectorizer()
    docs       = vectorizer.fit_transform(corpus.data)
    features   = vectorizer.get_feature_names()
    visualizer = FreqDistVisualizer(features=features)
    visualizer.fit(docs)
    visualizer.poof(outpath='text_hobbies_FreqDistVisualizer.png')
    #去停用詞
    vectorizer = CountVectorizer(stop_words='english')
    docs       = vectorizer.fit_transform(corpus.data)
    features   = vectorizer.get_feature_names()
    visualizer = FreqDistVisualizer(features=features)
    visualizer.fit(docs)
    visualizer.poof(outpath='text_hobbies_FreqDistVisualizer_stop_words.png')


def hobbiesFreqDistVisualizer2():
    '''
    探索 烹飪和遊戲 兩種愛好的頻度分佈
    (報錯:沒有label,應該為corpus.target)
    '''
    corpus=load_corpus("data/hobbies")
    #烹飪愛好頻度分佈統計圖
    hobbies=defaultdict(list)
    for text,label in zip(corpus.data,corpus.target):
        hobbies[label].append(text)
    vectorizer = CountVectorizer(stop_words='english')
    docs       = vectorizer.fit_transform(text for text in hobbies['cooking'])
    features   = vectorizer.get_feature_names()
    visualizer = FreqDistVisualizer(features=features)
    visualizer.fit(docs)
    visualizer.poof(outpath='text_hobbies_cooking_FreqDistVisualizer.png')
    #遊戲愛好頻度分佈統計圖
    hobbies=defaultdict(list)
    for text,label in zip(corpus.data, corpus.target):
        hobbies[label].append(text)
    vectorizer = CountVectorizer(stop_words='english')
    docs       = vectorizer.fit_transform(text for text in hobbies['gaming'])
    features   = vectorizer.get_feature_names()
    visualizer = FreqDistVisualizer(features=features)
    visualizer.fit(docs)
    visualizer.poof(outpath='text_hobbies_gaming_FreqDistVisualizer.png')


def hobbiesTSNEVisualizer():
    '''
    t-SNE語料庫視覺化
    T分佈隨機鄰域嵌入,t-SNE。Scikit-Learn將此分解方法實現為sklearn.manifold.TSNE轉換器。
     通過使用來自原始維度和分解維度的不同分佈將高維文件向量分解為二維。 通過分解為2維或3維,
     可以使用散點圖來顯示文件。
    '''
    corpus=load_corpus("data/hobbies")
    tfidf  = TfidfVectorizer()
    docs   = tfidf.fit_transform(corpus.data)
    labels = corpus.target
    tsne = TSNEVisualizer()
    tsne.fit(docs, labels)
    tsne.poof(outpath='text_hobbies_TSNEVisualizer.png')
    #Don't color points with their classes
    tsne = TSNEVisualizer(labels=["documents"])
    tsne.fit(docs)
    tsne.poof(outpath='text_hobbies_TSNEVisualizer_nocolor.png')


def hobbiesClusterTSNEVisualizer():
    '''
    聚類應用
    '''
    corpus=load_corpus("data/hobbies")
    tfidf  = TfidfVectorizer()
    docs   = tfidf.fit_transform(corpus.data)
    clusters=KMeans(n_clusters=5)
    clusters.fit(docs)
    tsne=TSNEVisualizer()
    tsne.fit(docs,["c{}".format(c) for c in clusters.labels_])
    tsne.poof(outpath='text_hobbies_cluster_TSNEVisualizer.png')

text_hobbies_FreqDistVisualizer.png

640?wx_fmt=png

text_hobbies_FreqDistVisualizer_stop_words.png

640?wx_fmt=png

text_hobbies_cooking_FreqDistVisualizer.png

640?wx_fmt=png

text_hobbies_gaming_FreqDistVisualizer.png

640?wx_fmt=png

text_hobbies_TSNEVisualizer.png

640?wx_fmt=png

text_hobbies_TSNEVisualizer_nocolor.png

640?wx_fmt=png

text_hobbies_cluster_TSNEVisualizer.png

640?wx_fmt=png

這裡簡單介紹一些TSNE,t-distributed Stochastic Neighbor Embedding(t-SNE)是目前來說效果最好的資料降維與視覺化方法,但是它的缺點也很明顯,比如:佔記憶體大,執行時間長。但是,當我們想要對高維資料進行分類,又不清楚這個資料集有沒有很好的可分性(即同類之間間隔小,異類之間間隔大),可以通過 t-SNE 投影到 2 維或者3維的空間中觀察一下。如果在低維空間中具有可分性,則資料是可分的;如果在高維空間中不具有可分性,可能是資料不可分,也可能僅僅是因為不能投影到低維空間。

TSNE將資料點之間的相似度轉換為概率。原始空間中的相似度由高斯聯合概率表示,嵌入空間的相似度由“Student t 分佈”表示。雖然 Isomap,LLE 和 variants等資料降維和視覺化方法,更適合展開單個連續的低維的manifold。但如果要準確的視覺化樣本間的相似度關係,t-SNE表現更好。因為t-SNE主要是關注資料的區域性結構。

Yellowbrick對資料的視覺化有更加高階的封裝和實現,對於新手和有一定經驗的分析人員來說都是非常友好的,這裡強烈推薦入門這款神器,一篇文章的內容有限不足以講清楚整個模組,感興趣的話可以閱讀我的系列文章。

640?wx_fmt=png

很高興在自己溫習回顧知識的同時能寫下點分享的東西出來,如果說您覺得我的內容還可以或者是對您有所啟發、幫助,還希望得到您的鼓勵支援!

- END -
如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。微信搜尋「perfect_iscas」,關注後回覆「進群」或者掃描下方二維碼即可進入無廣告技術交流群。
掃描二維碼進群↓

640?wx_fmt=jpeg

640

640?wx_fmt=gif

在看 640?wx_fmt=jpeg

相關文章