《Python數據科學手冊》學習筆記及書評


《Python數據科學手冊》學習筆記

寫在前面

  • 封面

    在這里插入圖片描述

  • 讀后感

    • 只能說挺不錯的,前面數據分析部分挺好,后面機器學習部分差點東西

1. 食譜數據庫數據找不到的問題

  • 問題:

    • 在P163頁,3.11.3 案例:食譜數據庫中,涉及到的食譜數據無法下載,在網上也找不到資源。是不是很揪心!!!是不是很絕望!!!
    • 我也是。。。然后我在網上搜了大概半個小時把,放棄了,然后慢慢看書上給的連接:食譜數據庫
    • 我想,肯定有很多跟我看同一本書的歪果仁,在評論區吐槽沒有數據。
    • 果然讓我找到了解決辦法。。。時隔多年,作者之一總算過來提供最新數據連接了。。。參考鏈接
  • 結論:

2.Seaborn馬拉松可視化里時分秒轉化為秒數的問題

  • 抄作業

    在做Python Data Science Handbook的實例學習,4.16.3 案例:探索馬拉松比賽成績里,有提示將時分秒的時間化為秒的總數,以方便畫圖。書里給出的指令是:

    data['split_sec']=data['split'].astype(int)/1E9

    data['final_sec']=data['final'].astype(int)/1E9

    我用這種方式會出現以下錯誤:

    TypeError: cannot astype a timedelta from [timedelta64[ns]] to [int32]

  • 結論

    • 描述的連接里面給出了一種解決辦法,可是這種解決辦法太復雜了,我想了一個更簡單的

    • 先寫一個將Timedelta格式的時間數據轉化為總秒數的函數:

      data['split_sec'] = data['split'].apply(transfor_time)
      data['final_sec'] = data['final'].apply(transfor_time)
      
    • 然后對我們需要的列廣播這個函數:

      data['split_sec'] = data['split'].apply(transfor_time)
      data['final_sec'] = data['final'].apply(transfor_time)
      
    • 查看結果:

      data.head()
      

      img

    • OK!完美解決。。。

3. scikit-learn使用fetch_mldata無法下載MNIST數據集的問題

4. GridSearchCV.grid_scores_和mean_validation_score報錯

  • 問題:

    • 在P438頁,5.13.4 示例:不是很朴素的貝葉斯中的2. 使用自定義評估器小節中有這樣一行代碼:scores = [val.mean_validation_score for val in grid.grid_scores_]

    • 運行之后報錯:AttributeError: 'GridSearchCV' object has no attribute 'grid_scores_'

      img

    • 經過百度了之后,可以知道grid_scores_在最新的sklearn中已經被棄用了,換成了cv_results_參考鏈接

    • 那么,更改這個參數后,依然報錯:AttributeError: 'str' object has no attribute 'mean_validation_score'

      img

    • 這個問題就再也沒有搜到好的解決方案了,所以我去查了GridSearchCV的文檔

    • 然后發現,關於cv_results_的內容如下:

      img

    • 這就很尷尬了,所以沒有一個參數是包含validation關鍵字的,我的理解是,驗證集和測試集在某種情況下可以認為是等價的。所以我猜測mean_validation_score對應的應該就是mean_test_score

    • 這樣,原來的代碼就改成了scores = grid.cv_results_['mean_test_score']

    • 為了證明我的猜想是正確的,所以,按照得到的scores結果,順着其他的代碼,知道最后繪圖:

      img

    • 事實證明,跟書上得到圖一毛一樣,所以證明我對源代碼修改的猜想是正確的

    • 即證明了

      • 舊版本代碼:scores = [val.mean_validation_score for val in grid.grid_scores_]
      • 與新版本代碼:scores = grid.cv_results_['mean_test_score']
      • 等價!

5. Jupyter導出PDF從入門到絕望

  • 問題:

    • 我在使用jupyter lab的時候,想要把我的代碼和結果導出成pdf格式的(由於里面有圖片,所以不想導出成html)。然后報錯:

      img

    • 然后我用pip安裝了pandoc,發現並沒有什么luan用。並且好像跟報錯所指的pandoc不一樣。反正就是絕望就完事兒了

  • 方案:

    1. 下載安裝windows開發環境包的管理器,Chocolatey。參考官網了連接,用cmd粘代碼就能裝:官網

      @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

    2. 然后呢,就可以用這個管理工具安裝pandoc了,參考pandoc官網

      choco install pandoc

      img

    3. 安裝完事兒!

      img

    4. 然后導出pdf的時候發現,竟然對pandoc的版本有要求,也是佛了,那就重新搞一下把。。。

      img

      安裝固定版本的pandoc,根據官網發布的版本list,我選擇安裝1.19版本的。choco install pandoc --version 1.19

      img

      安裝時安裝完畢了,不知道為啥,一副好像報錯了的樣子,下的我趕緊去看一下到底是安裝好了沒。。。

      img

      應該是完事兒了,然后試試導出pdf。

    5. pandoc好像是沒有問題了,可是另一個包好像又除了問題:

      img

      所以現在又要安裝這個:

      choco install miktex

      img

    6. 完。。。做完這一步,電腦自動重啟了,然后jupyter lab打不開了,報錯:

      ImportError: cannot import name 'constants' from 'zmq.backend.cython’

      然后沒辦法,用pip升級了一下pyzmq包,總算是能打開了。。。

      img

      然后,告訴我,我下載的插件不能用了,要重新“build”,所以就重新安裝了插件。。。(像顯示目錄啊之類的插件。。。)

      img

      我真的很絕望。。。

      img

    7. 然后依然報同樣的錯誤。。。於是我懷疑,是不是MikTex有錯,於是在官網上下了一個exe安裝的那種,一路確認下去。。。參考鏈接下載鏈接

      果然,在點了導出pdf的時候,報錯缺少的文件就彈出來安裝程序了。。。

      img

    8. 然后就成功保存pdf啦!

      img

  • 另辟蹊徑

    說實話,這樣導出來的pdf並不好看,還有一種方法,直接導出html,里面保留了插入的圖片的那種,更能還原jupyter原來的排版。參考鏈接

6. 機器學習部分筆記

6.1 判定系數

  1. 定義

    判定系數(coefficient of determination),也叫可決系數或決定系數,是指在線性回歸中,回歸平方和與總離差平方和之比值,其數值等於相關系數的平方。它是對估計的回歸方程擬合優度的度量。(參考:百度百科

    判定系數(記為R$^2$)在統計學中用於度量因變量的變異中可由自變量解釋部分所占的比例,以此來判斷統計模型的解釋力。對於簡單線性回歸而言,判定系數為樣本相關系數的平方。

    假設一數據集包括$y_1, y_2, ..., y_n$共n個觀察值,相對應的模型預測值分別為$f_1, f_2, ..., f_n$。定義殘差$e_i = y_i - f_i$,

    平均觀察值為:$\bar{y} = \cfrac{1}{n} \sum\limits_{i=1}^n y_i$

    於是可以得到總平方和:$SS_{tot} = \sum\limits_{i=1} (y_i - \bar{y})^2$

    回歸平方和:$SS_{reg} = \sum\limits_{i=1} (f_i - \bar{y})^2$

    殘差平方和:$SS_{res} = \sum\limits_{i=1} (y_i - f_i)^2 = \sum\limits_{i=1} e_i^2$

    由此,判定系數可定義為:$R^2 = 1 - \cfrac{SS_{res}}{SS_{tot}}$

  2. 總結

    R$^2$ = 1:表示模型與數據完全吻合。

    R$^2$ = 0:表示模型不比簡單取均值好。

    R$^2$ < 0:表示模型性能很差。

  3. 系數標准

    判定系數只是說明列入模型的所有解釋變量對因變量的聯合的影響程度,不說明模型中單個解釋變量的影響程度。
    判定系數達到多少為宜?沒有一個統一的明確界限值;若建模的目的是預測因變量值,一般需考慮有較高的判定系數。若建模的目的是結構分析,就不能只追求高的判定系數,而是要得到總體回歸系數的可信任的估計量。判定系數高並不一定說明每個回歸系數都可信任。

6.2 朴素貝葉斯

  1. 貝葉斯定理

    我們在生活中經常遇到這種情況:我們可以很容易直接得出P(A|B),P(B|A)則很難直接得出,但我們更關心P(B|A),貝葉斯定理就為我們打通從P(A|B)求得P(B|A)的道路。

    $P(B|A) = \cfrac{P(A|B)P(B)}{P(A)}$

    推導:$P(A, B) = P(B|A) * P(A) = P(A|B) * P(B)$

    參考:機器學習之貝葉斯(貝葉斯定理、貝葉斯網絡、朴素貝葉斯)

    朴素貝葉斯分類是一種十分簡單的分類算法,叫它朴素貝葉斯分類是因為這種方法的思想真的很朴素。

    朴素貝葉斯的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,就好比這么個道理,你在街上看到一個黑人,我問你你猜這哥們哪里來的,你十有八九猜非洲。為什么呢?因為黑人中非洲人的比率最高,當然人家也可能是美洲人或亞洲人,但在沒有其它可用信息下,我們會選擇條件概率最大的類別,這就是朴素貝葉斯的思想基礎。

  2. 朴素貝葉斯的應用場景

    由於朴素貝葉斯分類器對數據有嚴格的假設,因此它的訓練效果通常比復雜模型的差。其優點主要體現在以下四個方面。

    • 訓練和預測的速度非常快
    • 直接使用概率預測
    • 通常很容易理解
    • 可調參數(如果有的話)非常少。

    朴素貝葉斯分類器非常適合用於以下應用場景:

    • 假設分布函數與數據匹配(實際中很少見)。
    • 各種類型的區分度很高,模型復雜度不重要。
    • 非常高維度的數據,模型復雜度不重要。

6.3 自舉重采樣方法

  • 模式識別中每個方法的實現都是基於一個特定的數據樣本集的,但是這個樣本集只是所有可能的樣本中的一次隨機抽樣,畢竟在我們的生活實際中存在着萬物眾生,多到我們數也數不清,甚至計算機都無法統計的清,而我們搜集到的充其量只是其中很小很小的一部分,這也是為什么機器學習中缺少的只是數據,只要有足夠多的學習數據,就一定能取得驚人的結果,因此模式識別和機器學習中的很多方法的實現結果都無疑會受到這種隨機性的影響,我們訓練得到的分類器也因此具有偶然性,尤其是樣本不足夠多時更為明顯。
  • 對於決策樹而言,其樹的生長是采用的貪心算法,只考慮當前局部的最優,因此其受這種隨機性影響會更加嚴重,這也是為什么有的決策樹泛化能力那么差的原因。
  • 針對這種隨機性的影響,最早在統計學中有人提出了一種叫做”自舉(Bootstrap)“的策略,基本思想是對現有樣本進行重復采樣而產生多個樣本子集,通過這種多次重復采樣來模擬數據的隨機性,然后在最后的輸出結果中加進去這種隨機性的影響。隨后有人把這種自舉的思想運用到了模式識別中,衍生出了一系列的解決方法,像隨機森林、Bagging、Adaboost等。

6.4 白化

  • 白化的目的是去除輸入數據的冗余信息。假設訓練數據是圖像,由於圖像中相鄰像素之間具有很強的相關性,所以用於訓練時輸入是冗余的;白化的目的就是降低輸入的冗余性。

  • 輸入數據集X,經過白化處理后,新的數據X'滿足兩個性質:

    (1) 特征之間相關性較低;
    (2) 所有特征具有相同的方差。

  • 其實我們之前學的PCA算法中,可能PCA給我們的印象是一般用於降維操作。然而其實PCA如果不降維,而是僅僅使用PCA求出特征向量,然后把數據X映射到新的特征空間,這樣的一個映射過程,其實就是滿足了我們白化的第一個性質:除去特征之間的相關性。因此白化算法的實現過程,第一步操作就是PCA,求出新特征空間中X的新坐標,然后再對新的坐標進行方差歸一化操作。

  • 參考鏈接:機器學習(七)白化whiteningPCA 和 白化區別

6.5 機器學習章節總結

  1. 有監督學習

    • 高斯朴素貝葉斯(Gaussian naive Bayes):速度快,不需要選擇超參數,所以通常很適合作為初步分類手段,在借助更復雜的模型進行優化之前使用。這個方法假設每個特征中屬於一類的觀測值都符合高斯分布,且變量無協方差(即線性無關)。橢圓曲線表示每個標簽的高斯生成模型,越靠近橢圓中心的可能性越大。通過這種類似的生成模型,可以計算出任意數據點的似然估計(likelihood)P(特征|$L_1$),然后根據貝葉斯定理計算出后驗概率比值,從而確定每個數據點可能性最大的標簽。貝葉斯主義(Bayesian formalism)的一個優質特性是它天生支持概率分類,我們可以用predict_proba方法計算樣本屬於某個標簽的概率。缺點:由於分類結果只能依賴於一開始的模型假設,因此高斯朴素貝葉斯經常得不到非常好的結果。
    • 多項式朴素貝葉斯(multinomial naive Bayes)它假設特征是由一個簡單多項式分布生成的。優點:多項分布可以描述各種類型樣本出現次數的概率,因此多項式朴素貝葉斯非常適用於描述出現次數或者出現次數比例的特征。
    • 簡單線性回歸(Linear Regression):將數據擬合成一條直線。除了簡單的線性擬合,它還可以處理多維度的線性回歸模型。
    • 基函數回歸(basis function regression):通過基函數對原始數據進行變換,從而將變量間的線性回歸模型轉換為非線性回歸模型。有多項式基函數高斯基函數等。
    • 正則化(regularization):雖然在線性回歸模型中引入基函數會讓模型變得更加靈活,但是也很容易造成過擬合。當基函數重疊的時候,通常就表明出現了過擬合:相鄰基函數的系數想相互抵消。對較大的模型參數進行懲罰(penalize),從而抑制模型的劇烈波動,這個懲罰機制被稱為正則化。有嶺回歸(ridge regression,$L_2$范數正則化):$P = \alpha \sum_{n=1}^N \theta_n^2$、Lasso正則化($L_1$范數):$P = \alpha \sum_{n=1}^N |\theta|$。Lasso正則化傾向於構建稀疏矩陣,即它更喜歡將模型系數設置為0。
    • 支持向量機(support vector machine, SVM):不同於貝葉斯分類器,首先對每個類進行了隨機分布的假設,然后用生成的模型估計新數據點的標簽。——生成分類方法;支持向量機是判別分類方法:不再為每類數據建模、而是用一條分割線(二維空間中的直線或曲線)或者流體形(多維空間中的曲線、曲面等概念的推廣)將各種類型分割開。邊界最大化評估器。核變換核函數技巧處理非線性問題。SVM實現了一些修正因子來軟化邊界
    • 決策樹:采用非常直觀的方式對事物進行分類或打標簽,二叉樹分支方法缺點:決策樹非常容易陷得很深(過擬合)。
    • 隨機森林:通過組合多個過擬合評估器來降低過擬合程度的想法,其實是一種集成學習方法,稱為裝袋算法優點:無參數的隨機森林模型非常適合處理多周期數據,不需要我們配置多周期模型!訓練和預測速度都非常快。多任務可以直接並行計算。多棵樹可以進行概率分類。無參數模型很靈活,在其他評估器都欠擬合的任務中表現突出。缺點:結果不太容易解釋。
  2. 無監督學習

    • 主成分分析技術(principal component analysis, PCA):這是一種快速線性降維技術。沿着最不重要的主軸的信息都被去除了,僅留下含有最高方差值的數據成分。降維原理:發現一組比原始的像素基向量更能有效表示輸入數據的基函數。用PCA作噪音過濾:建模->逆變換重構。缺點:經常受數據集的異常點影響。RandomizedPCA:使用了一個非確定算法,快速地近似計算出一個維度非常高的數據的前幾個主成分。SparsePCA:引入了一個正則項來保證成分的稀疏性。
    • 流形學習它試圖將一個低維度流形嵌入到一個高維度空間來描述數據集。多維度標度法(multidimensional scaling,MDS):它可以將一個數據集的距離矩陣還原成一個D維坐標來表示數據集。缺點:無法展示數據非線性嵌入的特征。當MDS失敗時,局部線性嵌入法(locally linear embedding,LLE):該方法不保留所有的距離,而是只保留鄰節點間的距離。通常情況下,modified LLE的效果比用其他算法還原實現定義好的流形數據的效果好。保距映射法(isometric mapping,Isomap):雖然LLE通常對現實世界的高維數據源的學習效果比較差,但是Isomap算法往往會獲得比較好的嵌入效果。t-分布鄰域嵌入算法(t-distributed stochastic neighbor embedding, t-SNE):將它用於高度聚類的數據效果比較好,但是該方法比其他方法學習速度慢。
    • k-means聚類:在不帶標簽的多維數據集中尋找確定數量的簇,最優的聚類結果需要符合以下兩個假設:a. “簇中心點”是屬於該簇的所有數據點坐標的算術平均值。b. 一個簇的每個點到該簇中心點的距離比其他簇中心點的距離短。k-means方法使用了一種容易理解、便於重復的期望最大化算法(E-M算法)取代了窮舉搜索。使用E-M算法時的注意事項:a. 可能不會達到全局最優結果;b. 簇數量必須事先定好;c. k-means算法只能確定線性聚類邊界。但是我們可以通過一個核變換將數據投影到更高維的空間,投影后的數據使線性分離稱為可能。(這種核k-means算法可以在sklearn.cluster.SpectralClustering評估器中實現,它使用最鄰近來計算數據的高維表示,然后用k-means算法分配標簽); d. 當數據量較大時,k-means會很慢。這時就需要將“每次迭代都必須使用所有數據點”這個條件放寬,例如每一步僅使用數據集的一個子集來更新簇中心點。這恰恰就是批處理(batch-based)k-means算法的核心思想,該算法在sklearn.cluster.MiniBatchKMeans中實現。還可以使用k-means用於色彩壓縮缺點:在實際應用中,k-means的非概率性和它僅根據到簇中心點的距離來指派簇的特點將導致性能低下。由於k-means本身沒有度量簇的分配概率或不確定性的方法,k-means可以理解為在每個簇的中心放置了一個圓,在這個圓圈之外的任何點都不是該簇的成員。所有k-means的這兩個缺點——類的形狀缺少靈活性缺少簇分配的概率——使得它對許多數據集(特別是低維數據集)的擬合效果不盡人意。
    • 高斯混合模型(Gaussian mixture model, GMM):該模型可以被看作是k-means思想的一個擴展,一個聚類和密度評估器的混合體。GMM模型試圖將數據構造成若干服從高斯分布的概率密度函數簇,即用不同高斯分布的加權匯總來表示概率分布估計。高斯混合模型本質上與k-means模型非常類似,它們都是用了期望最大化(E-M)方法。但高斯混合模型的每個簇的結果並不與硬邊緣的空間有關,而是通過高斯平滑模型實現。GMM算法的本質是一個密度估計算法,即GMM擬合的結果並不是一個聚類模型,而是描述數據分布的生成概率模型。GMM可以利用改模型來評估數據的似然估計,並利用交叉驗證來防止過擬合,還有一些糾正過擬合的標准分析方法,例如赤池信息准則(Akaike information criterion,AIC)貝葉斯信息准則(Bayesian information criterion,BIC)調整模型的似然估計。類的最優數量出現在AIC或BIC曲線最小值的位置。生成模型是貝葉斯生成分類器的一個非常有用的成分。
    • 核密度估計(kernel density estimation,KDE):該算法將高斯混合理念擴展到了邏輯極限(logical extreme)。它通過對每個點生成高斯分布的混合成分,獲得本質上是無參數的密度估計器。核密度估計的自有參數是:a. 核類型(kernel),它可以指定每個點核密度分布的形狀;b. 核帶寬(kernel bandwidth),它控制每個點的核的大小。
  3. 驗證模型(根據書上的例子,分為分類和回歸,當然部分函數是可以混用的)

    1. 留出集和特征工程

      • sklearn.model_selection.train_test_split留出集X1, X2, y1, y2 = train_test_split(X, y, random_state, train_size)
      • sklearn.feature_extraction.DictVectorizer獨熱編碼。解決常見的非數值類型的分類特征。vec = DictVectorizer(sparse, dtype)
      • sklearn.feature_extraction.text.CountVectorizer單詞統計。將文字編碼成數字的技術手段。vec = CountVectorizer()
      • sklearn.feature_extraction.text.TfidVectorizerTF-IDF(term frequency-inverse document frequency,詞頻逆文檔頻率)。通過單詞在文檔中出現的頻率來衡量其權重,IDF的大小與一個詞的常見程度成反比。vec = TfidVectorizer()
      • sklearn.preprocessing.PolynomialFeatures多項式特征,輸入特征經過數學變換衍生出來的新特征,這種特征叫做衍生特征,這種處理方式被稱為基函數回歸(basis function regression)。poly = PolynomialFeatures(degree, include_bias)
      • sklearn.preprocessing.Imputer缺失值補充。用均值、中位數、眾數等填充方法補充缺失值。imp = Imputer(strategy)
      • sklearn.pipeline.make_pipeline特征管道。將多個步驟串起來。model = make_pipeline(*steps)
      • skimage.feature.hogHOG特征(方向梯度直方圖,Histogram of Oriented Gradients)。它可以將圖像像素轉換為向量形式,與圖像具體內容有關,與圖像合成因素無關。它是一個簡單的特征提取程序,專門用來識別行人(pedestrians)的圖像內容。
    2. 分類(Classification)

      • sklearn.metrics.accuracy_score:驗證模型越策結果的准確率(預測的所有結果中,正確結果占總預測樣本數的比例)。accuracy_score(y_true, y_pred)
      • sklearn.metrics.confusion_matrix混淆矩陣,分類結果和原始標簽的一個表。confusion_matrix(y_true, y_pred)
      • sklearn.model_selection.cross_val_score交叉驗證cross_val_score(model, X, y, cv)
      • sklearn.model_selection.LeaveOneOut留一(LOO)交叉驗證cross_val_score(model, X, y, cv=LeaveOneOut())
    3. 回歸(Regression)

      • sklearn.model_selection.validation_curve驗證曲線。計算驗證范圍內的訓練得分和驗證得分。train_score, val_score = validation_curve(model, X, y, param_name, param_range, cv)
      • sklearn.model_selection.learning_curve學習曲線。反映訓練集規模的訓練得分 / 驗證得分曲線。learning_curve(model, X, y, cv, training_sizes)
      • sklearn.model_selection.GridSearchCV網格搜索。尋找模型的最優參數。GridSearchCV(model, param_grid, cv)

7. 高斯過程學習筆記 / Gaussion Process

  • 參考鏈接:透徹理解高斯過程Gaussian Process (GP)

    1. 高斯過程模型屬於無參數模型,相對解決的問題復雜度及與其它算法比較減少了算法計算量。
    2. 高斯模型可以解決高維空間(實際上是無限維)的數學問題,可以面對負雜的數學問題。
    3. 結合貝葉斯概率算法,可以實現通過先驗概率,推導未知后驗輸入變量的后驗概率。由果推因的概率。
    4. 高斯過程觀測變量空間是連續域,時間或空間。
    5. 高斯過程觀測變量空間是實數域的時候,我們就可以進行回歸而實現預測。
    6. 高斯過程觀測變量空間是整數域的時候(觀測點是離散的),我們就可以進行分類。結合貝葉斯算法甚至可以實現單類分類學習(訓練),面對小樣本就可以實現半監督學習而后完成分類。面對異常檢測領域很有用,降低打標簽成本(小樣本且單類即可訓練模型)。
      所以說,我們快點進入高斯過程-貝葉斯概率算法模型吧,功能非凡。

碌碌謀生,謀其所愛。🌊 @李英俊小朋友


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM