重回機器學習-《python機器學習及實踐》讀書筆記二
一.三個率
機器學習模型訓練好之後,會在樣本外進行測試,然後我們可以得到三個“率”:
- 準確率
- 召回率
- 精確率
其實這些也沒有什麼大不了的,大家如果學習過基本的統計學的話就會知道,這就是所謂的一類錯誤、二類錯誤的一個變體。
首先是準確率,這個最好理解,就是你的模型在樣本外測試中正確的次數。當然,我們討論的前提都是一個二分類問題。這三個“率”是這麼定義的:
這就是書中的公式,Accuracy就不說了。召回率比較有意思,是猜對的原本為真的數目作為分子,然後分母是所有猜對的數目。也就是你模型正確預測中某一型別的佔比。精確率是某一型別總數中正確預測的佔比。有點繞,理解一下就行。
為了調和精確率和召回率,還有一個F1指標,其實就是精確率和召回率的調和平均。調和平均有一個特點,會對調和平均的物件的方差進行懲罰。
也就是說,精確率和召回率越接近,那麼F1指標會越好,當然,前提是兩個算術均值相同的前提下。
二、缺失值的填充
機器學習建模中也好,量化模型建模中也好,資料預處理永遠是逃不過的,也是最重要的步驟。而其中缺失值的填充是一個繞不開的話題。
在書中的坦坦尼克的例子中,就用了一種最簡單的缺失值填充的方法,均值填充。這種方法其實是在沒有任何資訊的前提下,處於不影響現有資訊的目的而採用的。實際過程中,我們可能還會根據資料的分佈採用中位數之類的。
更加複雜的缺失值填充方法有很多,可以單獨建立一個缺失值填充模型。譬如量化中的barra模型採用的因子值的缺失值填充方法,就是採用線性模型填充法。原本對於缺失值填充方法就很有藝術性。
import pandas as pd titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt') X = titanic[['pclass', 'age', 'sex']] y = titanic['survived'] X['age'].fillna(X['age'].mean(), inplace=True)
資料內容大概是這樣的:
三、型別資料
sklearn中有自帶的型別資料處理,其實就是變成一個啞變數。
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
vec.fit_transform(X.to_dict(orient='record'))
最後得到的每一條記錄變現下面這樣的了:
簡單解釋一下,就是原來的age由於是數字,所以依然保留,而後面的pclass和sex則被sklearn自動識別為類別變數,然後自動轉化為啞變數的。啞變數的含義如下,可以通過feature_names_方法來獲得。
這裡有一個不怎麼常用的pandas的to_dict方法。這個方法給大家仔細解讀一下。
四、to_dict方法
預設的to_dict方法其實就是一層一層的字典,先是列名,然後是index,然後是value
我們上面用到的,record設定就變成了每一條記錄變成一個字典,最後是一個list。這也就是record的含義了。
設定為list的話,那麼字典中就是columns names最為keys,每一列,也就是每個屬性下面的所有值作為一個list成為字典的values。
還有一個屬性是split這個比較有意思。首先是,諷刺啦index,data,columns。其實分別給出了整個dataframe的結構。