數據分析4 - 實戰篇

數據分析實戰4.實戰篇


37丨數據採集實戰:如何自動化運營微博?

目標

  • 掌握 Selenium 自動化測試工具,以及元素定位的方法;
  • 學會編寫微博自動化功能模塊:加關注,寫評論,發微博;
  • 對微博自動化做自我總結。

Selenium 自動化測試工具

當我們做 Web 自動化測試的時候,可以選用 Selenium 或者 Puppeteer 工具。我在第 10 篇的時候簡單介紹過 Selenium 這個工具,你可以再回顧一下。Puppeteer 通過控制無頭 Chrome 來完成瀏覽器的工作。這兩個工具之間的區別在於:Selenium 更關注程序執行的流程本身,比如找到指定的元素,設置相應的值,然後點擊操作。而 Puppeteer 是瀏覽者的視角,比如光標移動到某個元素上,鍵盤輸入某個內容等。

今天我們繼續使用 Selenium 工具自動化模擬瀏覽器,重點是學習對元素的定位。在第 10 篇講到 Selenium WebDriver 的使用時,重點是對 HTML 進行獲取和解析,然後通過 HTML 中的 XPath 進行提取,讀取相應的內容。

在今天的實戰裏,我們需要在微博上自動登錄,加關注,發評論,發微博等,這些操作都需要在瀏覽器上完成,所以我們可以使用 Webdriver 自帶的元素定位功能。

如果我們想定位一個元素,可以通過 id、name、class、tag、鏈接上的全部文本、鏈接上的部分文本、XPath 或者 CSS 進行定位,在 Selenium Webdriver 中也提供了這 8 種方法方便我們定位元素。

  • 通過 id 定位:我們可以使用 find_element_by_id() 函數。比如我們想定位 id=loginName 的元素,就可以使用 browser.find_element_by_id(“loginName”)。
  • 通過 name 定位:我們可以使用 find_element_by_name() 函數,比如我們想要對 name=key_word 的元素進行定位,就可以使用 browser.find_element_by_name(“key_word”)。
  • 通過 class 定位:可以使用 find_element_by_class_name() 函數。
  • 通過 tag 定位:使用 find_element_by_tag_name() 函數。
  • 通過 link 上的完整文本定位:使用 find_element_by_link_text() 函數。
  • 通過 link 上的部分文本定位:使用 find_element_by_partial_link_text() 函數。有時候超鏈接上的文本很長,我們通過查找部分文本內容就可以定位。
  • 通過 XPath 定位:使用 find_element_by_xpath() 函數。使用 XPath 定位的通用性比較好,因爲當 id、name、class 爲多個,或者元素沒有這些屬性值的時候,XPath 定位可以幫我們完成任務。
  • 通過 CSS 定位:使用 find_element_by_css_selector() 函數。CSS 定位也是常用的定位方法,相比於 XPath 來說更簡潔。

在我們獲取某個元素之後,就可以對這個元素進行操作了,對元素進行的操作包括:

  • 清空輸入框的內容:使用 clear() 函數;
  • 在輸入框中輸入內容:使用 send_keys(content) 函數傳入要輸入的文本;
  • 點擊按鈕:使用 click() 函數,如果元素是個按鈕或者鏈接的時候,可以點擊操作;
  • 提交表單:使用 submit() 函數,元素對象爲一個表單的時候,可以提交表單;

微博自動化運營:加關注,寫評論,發微博

總結

思考

  • 對某個指定用戶的 UID 做取消關注的操作,請你使用今天講的元素定位和操作功能,編寫相應的代碼。

  • 通過今天自動化測試工具的學習,你有怎樣的收穫和總結呢?


38丨數據可視化實戰:如何給毛不易的歌曲做詞雲展示?

目標

  • 掌握詞雲分析工具,並進行可視化呈現;
  • 掌握 Python 爬蟲,對網頁的數據進行爬取;
  • 掌握 XPath 工具,分析提取想要的元素 。

如何製作詞雲

首先我們需要了解什麼是詞雲。詞雲也叫文字雲,它幫助我們統計文本中高頻出現的詞,過濾掉某些常用詞(比如“作曲”“作詞”),將文本中的重要關鍵詞進行可視化,方便分析者更好更快地瞭解文本的重點,同時還具有一定的美觀度。

Python 提供了詞雲工具 WordCloud,使用 pip install wordcloud 安裝後,就可以創建一個詞雲。

從結果中看出,還是有一些常用詞顯示出來了,比如“什麼”“要求”“這些”等,我們可以把這些詞設置爲停用詞。

給毛不易的歌詞製作詞雲

  • 在準備階段:我們主要使用 Python 爬蟲獲取 HTML,用 XPath 對歌曲的 ID、名稱進行解析,然後通過網易雲音樂的 API 接口獲取每首歌的歌詞,最後將所有的歌詞合併得到一個變量。
  • 在詞雲分析階段,我們需要創建 WordCloud 詞雲類,分析得到的歌詞文本,最後可視化。

總結

思考題

最後給你留一道思考題吧。我抓取了毛不易主頁的歌詞,是以歌手主頁爲粒度進行的詞雲可視化。實際上網易雲音樂也有歌單的 API,比如 http://music.163.com/api/playlist/detail?id=753776811 。你能不能編寫代碼對歌單做個詞雲展示(比如歌單 ID 爲 753776811)呢?


39丨數據挖掘實戰(1):信用卡違約率分析

數據挖掘核心的問題

  • 如何選擇各種分類器,到底選擇哪個分類算法,是 SVM,決策樹,還是 KNN?
  • 如何優化分類器的參數,以便得到更好的分類準確率?

目標

  • 創建各種分類器,包括已經掌握的 SVM、決策樹、KNN 分類器,以及隨機森林分類器;
  • 掌握 GridSearchCV 工具,優化算法模型的參數;
  • 使用 Pipeline 管道機制進行流水線作業。因爲在做分類之前,我們還需要一些準備過程,比如數據規範化,或者數據降維等。

構建隨機森林分類器

隨機森林的英文是 Random Forest,英文簡寫是 RF。它實際上是一個包含多個決策樹的分類器,每一個子分類器都是一棵 CART 分類迴歸樹。所以隨機森林既可以做分類,又可以做迴歸。當它做分類的時候,輸出結果是每個子分類器的分類結果中最多的那個。你可以理解是每個分類器都做投票,取投票最多的那個結果。當它做迴歸的時候,輸出結果是每棵 CART 樹的迴歸結果的平均值。

使用 GridSearchCV 工具對模型參數進行調優

Python 給我們提供了一個很好用的工具 GridSearchCV,它是 Python 的參數自動搜索模塊。我們只要告訴它想要調優的參數有哪些以及參數的取值範圍,它就會把所有的情況都跑一遍,然後告訴我們哪個參數是最優的,結果如何。

使用 Pipeline 管道機制進行流水線作業

做分類的時候往往都是有步驟的,比如先對數據進行規範化處理,你也可以用 PCA 方法(一種常用的降維方法)對數據降維,最後使用分類器分類。

Python 有一種 Pipeline 管道機制。管道機制就是讓我們把每一步都按順序列下來,從而創建 Pipeline 流水線作業。每一步都採用 (‘名稱’, 步驟) 的方式來表示。

我們需要先採用 StandardScaler 方法對數據規範化,即採用數據規範化爲均值爲 0,方差爲 1 的正態分佈,然後採用 PCA 方法對數據進行降維,最後採用隨機森林進行分類。

對信用卡違約率進行分析

現在我們的目標是要針對這個數據集構建一個分析信用卡違約率的分類器。具體選擇哪個分類器,以及分類器的參數如何優化,我們可以用 GridSearchCV 這個工具跑一遍。

  • 加載數據;
  • 準備階段:探索數據,採用數據可視化方式可以讓我們對數據有更直觀的瞭解,比如我們想要了解信用卡違約率和不違約率的人數。因爲數據集沒有專門的測試集,我們還需要使用 train_test_split 劃分數據集。
  • 分類階段:之所以把數據規範化放到這個階段,是因爲我們可以使用 Pipeline 管道機制,將數據規範化設置爲第一步,分類爲第二步。因爲我們不知道採用哪個分類器效果好,所以我們需要多用幾個分類器,比如 SVM、決策樹、隨機森林和 KNN。然後通過 GridSearchCV 工具,找到每個分類器的最優參數和最優分數,最終找到最適合這個項目的分類器和該分類器的參數。

總結

今天我給你講了隨機森林的概念及工具的使用,另外針對數據挖掘算法中經常採用的參數調優,也介紹了 GridSearchCV 工具這個利器。並將這兩者結合起來,在信用卡違約分析這個項目中進行了使用。

很多時候,我們不知道該採用哪種分類算法更適合。即便是對於一種分類算法,也有很多參數可以調優,每個參數都有一定的取值範圍。我們可以把想要採用的分類器,以及這些參數的取值範圍都設置到數組裏,然後使用 GridSearchCV 工具進行調優。

思考

另外針對信用卡違約率分析這個項目,我們使用了 SVM、決策樹、隨機森林和 KNN 分類器,你能不能編寫代碼使用 AdaBoost 分類器做分類呢?其中 n_estimators 的取值有 10、50、100 三種可能,你可以使用 GridSearchCV 運行看看最優參數是多少,測試準確率是多少?


40丨數據挖掘實戰(2):信用卡詐騙分析

相比於信用卡違約的比例,信用卡欺詐的比例更小,但是危害極大。如何通過以往的交易數據分析出每筆交易是否正常,是否存在盜刷風險是我們這次項目的目標。

通過今天的學習,你需要掌握以下幾個方面:

  • 瞭解邏輯迴歸分類,以及如何在 sklearn 中使用它;
  • 信用卡欺詐屬於二分類問題,欺詐交易在所有交易中的比例很小,對於這種數據不平衡的情況,到底採用什麼樣的模型評估標準會更準確;
  • 完成信用卡欺詐分析的實戰項目,並通過數據可視化對數據探索和模型結果評估進一步加強了解。

構建邏輯迴歸分類器

邏輯迴歸,也叫作 logistic 迴歸。雖然名字中帶有“迴歸”,但它實際上是分類方法,主要解決的是二分類問題,當然它也可以解決多分類問題,只是二分類更常見一些。

在邏輯迴歸中使用了 Logistic 函數,也稱爲 Sigmoid 函數。Sigmoid 函數是在深度學習中經常用到的函數之一,函數公式爲:

函數的圖形如下所示,類似 S 狀:

模型評估指標

我們之前對模型做評估時,通常採用的是準確率 (accuracy),它指的是分類器正確分類的樣本數與總體樣本數之間的比例。這個指標對大部分的分類情況是有效的,不過當分類結果嚴重不平衡的時候,準確率很難反應模型的好壞。

先介紹下數據預測的四種情況:TP、FP、TN、FN。我們用第二個字母 P 或 N 代表預測爲正例還是負例,P 爲正,N 爲負。第一個字母 T 或 F 代表的是預測結果是否正確,T 爲正確,F 爲錯誤。

所以四種情況分別爲:

  • TP:預測爲正,判斷正確;
  • FP:預測爲正,判斷錯誤;
  • TN:預測爲負,判斷正確;
  • FN:預測爲負,判斷錯誤。

我們知道樣本總數 =TP+FP+TN+FN,預測正確的樣本數爲 TP+TN,因此準確率 Accuracy = (TP+TN)/(TP+TN+FN+FP)。

實際上,對於分類不平衡的情況,有兩個指標非常重要,它們分別是精確度召回率

精確率 P = TP/ (TP+FP),對應上面恐怖分子這個例子,在所有判斷爲恐怖分子的人數中,真正是恐怖分子的比例。

召回率 R = TP/ (TP+FN),也稱爲查全率。代表的是恐怖分子被正確識別出來的個數與恐怖分子總數的比例。

爲什麼要統計召回率和精確率這兩個指標呢?假設我們只統計召回率,當召回率等於 100% 的時候,模型是否真的好呢?

舉個例子,假設我們把機場所有的人都認爲是恐怖分子,恐怖分子都會被正確識別,這個數字與恐怖分子的總數比例等於 100%,但是這個結果是沒有意義的。如果我們認爲機場裏所有人都是恐怖分子的話,那麼非恐怖分子(極高比例)都會認爲是恐怖分子,誤判率太高了,所以我們還需要統計精確率作爲召回率的補充。

實際上有一個指標綜合了精確率和召回率,可以更好地評估模型的好壞。這個指標叫做 F1,用公式表示爲:

F1 作爲精確率 P 和召回率 R 的調和平均,數值越大代表模型的結果越好。

對信用卡違約率進行分析

  • 加載數據;
  • 準備階段:我們需要探索數據,用數據可視化的方式查看分類結果的情況,以及隨着時間的變化,欺詐交易和正常交易的分佈情況。上面已經提到過,V1-V28 的特徵值都經過 PCA 的變換,但是其餘的兩個字段,Time 和 Amount 還需要進行規範化。Time 字段和交易本身是否爲欺詐交易無關,因此我們不作爲特徵選擇,只需要對 Amount 做數據規範化就行了。同時數據集沒有專門的測試集,使用 train_test_split 對數據集進行劃分;
  • 分類階段:我們需要創建邏輯迴歸分類器,然後傳入訓練集數據進行訓練,並傳入測試集預測結果,將預測結果與測試集的結果進行比對。這裏的模型評估指標用到了精確率、召回率和 F1 值。同時我們將精確率 - 召回率進行了可視化呈現。

總結

思考題

最後留兩道思考題吧,今天我們對信用卡欺詐數據集進行了分析,它是一個不平衡數據集,你知道還有哪些數據屬於不平衡數據麼?另外,請你使用線性 SVM(對應 sklearn 中的 LinearSVC)對信用卡欺詐數據集進行分類,並計算精確率、召回率和 F1 值。


41丨數據挖掘實戰(3):如何對比特幣走勢進行預測?

總結

今天我給你講了一個比特幣趨勢預測的實戰項目。通過這個項目你應該能體會到,當我們對一個數值進行預測的時候,如果考慮的是多個變量和結果之間的關係,可以採用迴歸分析,如果考慮單個時間維度與結果的關係,可以使用時間序列分析。

根據比特幣的歷史數據,我們使用 ARMA 模型對比特幣未來 8 個月的走勢進行了預測,並對結果進行了可視化顯示。你能看到 ARMA 工具還是很好用的,雖然比特幣的走勢受很多外在因素影響,比如政策環境。不過當我們掌握了這些歷史數據,也不妨用時間序列模型來分析預測一下。

思考

最後依然是思考題環節,今天我們講了 AR、MA、ARMA 和 ARIMA,你能簡單說說它們之間的區別麼?

另外我在GitHub中上傳了滬市指數的歷史數據(對應的 shanghai_1990-12-19_to_2019-2-28.csv),請你編寫代碼使用 ARMA 模型對滬市指數未來 10 個月(截止到 2019 年 12 月 31 日)的變化進行預測(將數據轉化爲按月統計即可)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章