第一講 深度學習概述
1.1 深度學習的引出
特點:
-
通過 組合低層特征,形成了更加抽象的 高層特征。
-
表達式中的 u,w參數需要在訓練中通過 反向傳播多次迭代調整,使得整體的 分類誤差最小。
-
深度學習網絡往往 包含多個中間層(隱藏層),且網絡結構要更復雜一些。
1.2 數據集及其拆分
-
分類特征:花萼和花瓣的寬度和長度
-
其中 $x_i$ 為樣本特征。由於樣本(即一行)一般有多個特征,因而 $x_i = \{x_i^1, x_i^2,..., x_i^n\} $
-
而 $y_i$ 表示 樣本i 的 類別標簽。
-
ground truth:翻譯為地面實況。機器學習領域一般用於表示 真實值、標准答案 等,表示 通過 直接觀察收集到 的真實結果。
-
gold standard:金標准,醫學上一般指診斷疾病 公認的最可靠的方法。
-
機器學習領域更傾向於使用ground truth,如果用gold standard則表示可以很好地代表ground truth。
1.21 數據集與有監督學習
-
訓練集( training set):用來訓練模型,即被用來 學習 得到系統的 參數取值。
-
測試集( testing set):用於最終報告模型的評價結果,因此在訓練階段測試集中的樣本應該是不可見的。
-
對訓練集做進一步划分為 訓練集、驗證集 validation set。
-
驗證集:與測試集類似,也是用於評估模型的性能。
-
區別:是 驗證集 主要 用於 模型選擇 和 調整超參數,因而一般不用於報告最終結果。
1.22 訓練集測試集拆分
-
留出法( Hold-out Method)數據拆分步驟
1.將數據隨機分為兩組,一組做為訓練集,一組做為測試集
2.利用訓練集訓練分類器,然后利用測試集評估模型,記錄最后的分類准確率為此分類器的性能指標
- K折交叉驗證
- 過程
數據集被分成K份 (K通常取5或者10)
不重復地每次取其中 一份 做測試集,用其他 K-1 份做訓練集訓練,這樣會得到K個評價模型
將上述步驟2中的 K次評價 的性能 均值 作為最后評價結果
- 優點:
- K折交叉驗證的上述做法,有助於提高評估結果的穩定性
- 分層抽樣策略(Stratified k-fold)
過程:
將數據集划分成k份,特點在於,划分的k份中 ——
每一份內各個類別數據的比例 和 原始數據集中各個類別的比例 相同。
1.23 K折交叉驗證的應用—用網格搜索來調超參數
-
什么是超參數?
-
指在學習過程之前 需要設置其值的一些變量
-
而不是通過訓練得到的參數數據。如深度學習中的學習速率(learning rate)等就是超參數。
-
- 什么是網格搜索?
-
假設模型中有2個超參數:A和B。
-
A的可能取值為 ${a1,a2,a3}$;
-
B的可能取值為連續的,如在區間[0-1]。由於B值為連續,通常進行離散化,如變為 {0, 0.25, 0.5, 0.75, 1.0}
-
如果使用網格搜索,就是嘗試各種可能的 (A,B)對值,找到 能使的模型取得最高性能的 (A,B)值對。
確定評價指標(准確率等)
對於超參數取值的每種組合,在 訓練集 上使用 交叉驗證的方法 求得 其K次評價的性能均值
最后,比較哪種超參數取值組合的性能最好,從而得到最優超參數的取值組合。
1.3 分類及其性能度量
1.31 分類
-
分類問題是有監督學習的一個核心問題。分類解決的是要預測樣本屬於哪個或者哪些預定義的類別。此時輸出變量通常取有限個離散值。
-
分類的機器學習的兩大階段
-
從訓練數據中學習得到一個 分類決策函數 或 分類模型,稱為 分類器( classifier);
-
利用學習得到的分類器對新的輸入樣本進行類別預測。
-
-
兩類分類問題 與 多類分類問題:
-
多類分類問題也可以轉化為兩類分類問題解決,如采用 一對其余(One-Vs-Rest) 的方法:
-
將其中一個類標記為正類,然后將剩余的其它類都標記成負類。
1.32 分類性能度量 ☆☆☆
- 假設只有兩類樣本,即正例(positive) 和 負例 (negative)。
- 通常以關注的類為正類,其他類為負類。
-
-
第二個符號表示:預測的類別 ( Positive or Negative )
-
第一個表示:預測結果 ( True or False)
-
- 分類准確率( accuracy):分類器正確分類的樣本數與總樣本數之比:
-
$accuracy = \frac{TP+TN}{P+N}$
-
-
-
-
-
召回率{ recall):反映了 總正例 中被模型 正確判定正例 的比重。
-
醫學領域也叫做靈敏度( sensitivity)。在垃圾短信分類器中,指所有真的垃圾短信被分類器正確找出來的比例。
-
- Area( Area Under Curve,或者簡稱AUC):
-
Area的定義(p-r曲線下的面積):
- $Area = \int_0^1p(r)dr$
-
有助於彌補P、R的單點值局限性,可以反映全局性能。
-
-
如何繪制 P-R曲線
-
要得到PR曲線,需要一系列 Precision和Recall的值。這些系列值是通過 閾值 來形成的。對於每個測試樣本,分類器一般都會給了“Score”值,表示該樣本多大概率上屬於正例。
-
- 步驟:
-
-
從高到低將“ Score"值排序,並依此作為閾值 threshold;
-
對於每個閾值,“ Score"值大於或等於這個 threshold的測試樣本被認為正例,其它為負例。從而形成一組預測數據。(每個樣本設置不同閾值,算出precison和recall,從而形成一組數據)
-
- F值 ☆☆☆
-
F 值 ($F_\beta-score$) 是 精確率 和 召回率 的 調和平均:
-
$F_\beta-score=\frac{(1+\beta^2)*precison*recall}{(\beta^2*precision+recall)}$
-
$\beta一般大於0。當\beta=1時,退化為 F1$
-
$F_1$ 是最常用的 評價指標,即 表示二者同等重要
-
-
-
ROC(受試者工作特征曲線,receiver operating characteristic curve)
-
描繪了分類器在 $tp rate$ (真正正例占總正例的比率,反映命中概率,縱軸) 和
-
$fp rate$(錯誤的正例占反例的比率,反映誤診率、假陽性率、虛驚概率,橫軸)間的trade-off。
-
ROC曲線繪制 和 P-R曲線類似。
-
- ROC- AUC( Area Under Curve)定義為ROC曲線下的面積
-
-
AUC值提供了分類器的一個整體數值。通常AUC越大,分類器更好。
-
取值范圍為[0,1]
-
- 分類性能可視化
-
-
混淆矩陣的可視化:可用熱圖(heatmap)直觀展現類別的混淆情況
-
分類報告:顯示每個類的分類性能,包括每個類標簽的精確率、召回率、F1值等。
-
1.4 回歸問題及其性能度量
1.41 回歸分析( regression analysis)
回歸分析( regression analysis):
是確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法
和分類問題不同:
回歸 通常輸出為 一個實數數值。
分類 通常輸出為 若干指定的類別標簽。
1.42 常用的回歸性能度量方法
-
平均絕對誤差 MAE (mean_absolute_error)
- MAE ( Mean absolute error) 是 絕對誤差損失( absolute error loss)的期望值。
-
如果 $\hat{y_i}$ 是 第 $i$ 個樣本的 預測值,$y_i$是相應的真實值,那么在 $n_samples$個測試樣本上的 平均絕對誤差 (MAE) 的定義如下:
-
$MAE(y, \hat{y}) = \frac{1}{n_{sample}}\sum_{i=0}^{n_{samplee}-1}|y_i - \hat{y_i}|$
-
-
均方誤差 MSE (mean_squared_error) 及 均方根差 RMSE
-
MSE( Mean squared error),該指標對應於 平方誤差損失( squared errorloss)的期望值。
-
如果 $\hat{y_i}$ 是 第 $i$ 個樣本的 預測值,$y_i$是相應的真實值,那么在 $n_samples$個測試樣本上的 均方差 的定義如下:
-
$MSE(y, \hat{y}) = \frac{1}{n_{sample}}\sum_{i=0}^{n_{samplee}-1}|y_i - \hat{y_i}|^2$
-
均方根差RMSE:是MSE的平方根
-
-
logistic回歸損失(二類)
-
- 簡稱 Log loss,或交叉熵損失( cross-entropy loss)
-
常用於評價 邏輯回歸LR 和 神經網絡
-
- 簡稱 Log loss,或交叉熵損失( cross-entropy loss)
-
- 對於二類分類問題:
- 假設某樣本的真實標簽為 y (取值為0或1),概率估計為 $p = pr(y = 1)$
-
每個樣本的 log loss 是對 分類器 給定 真實標簽 的 負log似然估計(negative log-likelihood)
-
$L_{log}(y, p) = -log(pr(y|p)) = -(ylog(p) + (1- y)log(1-p))$
- 實例:
- logistic回歸損失(多類)
-
對於多類問題( multiclass problem),可將樣本的真實標簽( true label) 編碼成 1-of-K( K為類別總數)的 二元指示矩陣Y:
- 轉換舉例:假設 K = 3,即三個類
-
-
假設模型對測試樣本的概率估計結果為P,則在測試集(假設測試樣本總數為N)上的交叉熵損失表示如下:
- $L_{log}(Y, P) = -\frac{1}{N}\sum_{k=0}^{k-1}y_{i, k}logp_{i, k}$
-
$y_{i,k}$ :表示第 $i$ 個樣本的第 $k$ 個標簽的 真實值
-
即ground truth,具體含義為第 $i$ 個樣本,是否屬於第 $k$ 個標簽,注意由於表示為 “1-of-K" 模式,因此每個樣本只有其中一個標簽值為1,其余均為0。
-
-
$p_{i,k}$ :表示模型對第 $i$ 個樣本的 第 $k$ 個標簽的 預測值。
- 舉例:6個樣本,三個類
-
-
回歸評價的真實標簽(即ground truth)如何獲得?
-
- MAE,RMSE(MSE) 常用於評分預測評價,eg 很多提供推薦服務的網站都有一個讓用戶給物品打分的功能預測用廣對物品評分的行為稱為 評分預測。
1.5 一致性的評價方法(nlp用不到)
- 一致性評價:是指對兩個或多個相關的變量進行分析,從而衡量其相關性的密切程度。
-
問題舉例:
假設兩評委( rater)對5部電影的評分如下,則二者的一致如何?
rater1=[0.5,1.6,25,25,24]
rater2=[1.5,26,35,3.5,34]
-
皮爾森相關系數法
應用背景:
用來衡量兩個用戶之間興趣的 一致性
用來衡量 預測值與真實值 之間的 相關性
既適用於離散的、也適用於連續變量的 相關分析
X 和 Y 之間的皮爾森相關系數計算公式:
$\rho_{X,Y} = \frac{cov(X,Y)}{\sigma_X\sigma_Y} = \frac{E[(X-\mu_X)(Y-\mu_Y)]}{\sigma_X\sigma_Y}$
其中,$cov(X,Y)$ 表示X和Y之間的 協方差( Covariance)
$\sigma_X$ 是X的均方差,
$\mu_X$ 是 X 的均值,E表示數學期望
取值區間為[-1,1]。-1:完全的負相關,+1:表示完全的正相關,0:沒有線性相關。
- Cohen's kappa相關系數
與 皮爾森相關系數的區別:Cohens kappa相關系數,通常用於離散的分類的一致性評價。
其通常被認為比兩人之間的簡單一致百分比更強壯,因為 Cohen's kappa考慮到了:二人之間的隨機一致的可能性
如果評價者多於2人時,可以考慮使用 Fleiss' kappa
Cohen's kappa的計算方法:
- kappa score是一個介於-1到+1之間的數。
- Fleiss' Kappa
1.6 實例:繪制PR曲線
#利用鳶尾花數據集繪制P-R曲線 print(__doc__) #打印注釋 import matplotlib.pyplot as plt import numpy as np from sklearn import svm, datasets from sklearn.metrics import precision_recall_curve from sklearn.metrics import average_precision_score from sklearn.preprocessing import label_binarize from sklearn.multiclass import OneVsRestClassifier #一對其余(每次將一個類作為正類,剩下的類作為負類) # from sklearn.cross_validation import train_test_split #適用於anaconda 3.6及以前版本 from sklearn.model_selection import train_test_split #適用於anaconda 3.7 #以iris數據為例,畫出P-R曲線 iris = datasets.load_iris() X = iris.data #150*4 y = iris.target #150*1 # 標簽二值化,將三個類轉為001, 010, 100的格式.因為這是個多類分類問題,后面將要采用 #OneVsRestClassifier策略轉為二類分類問題 y = label_binarize(y, classes=[0, 1, 2]) #將150*1轉化成150*3 n_classes = y.shape[1] #列的個數,等於3 print (y) # 增加了800維的噪聲特征 random_state = np.random.RandomState(0) n_samples, n_features = X.shape X = np.c_[X, random_state.randn(n_samples, 200 * n_features)] #行不變,只增加了列,150*804 # 訓練集和測試集拆分,比例為0.5 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=random_state) #隨機數,填0或不填,每次都會不一樣 # 一對其余,轉換成兩類,構建新的分類器 classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True, random_state=random_state)) #訓練集送給fit函數進行擬合訓練,訓練完后將測試集的樣本特征注入,得到測試集中每個樣本預測的分數 y_score = classifier.fit(X_train, y_train).decision_function(X_test) # Compute Precision-Recall and plot curve #下面的下划線是返回的閾值。作為一個名稱:此時“_”作為臨時性的名稱使用。 #表示分配了一個特定的名稱,但是並不會在后面再次用到該名稱。 precision = dict() recall = dict() average_precision = dict() for i in range(n_classes): #對於每一類,計算精確率和召回率的序列(:表示所有行,i表示第i列) precision[i], recall[i], _ = precision_recall_curve(y_test[:, i], y_score[:, i]) average_precision[i] = average_precision_score(y_test[:, i], y_score[:, i])#切片,第i個類的分類結果性能 # Compute micro-average curve and area. ravel()將多維數組降為一維 precision["micro"], recall["micro"], _ = precision_recall_curve(y_test.ravel(), y_score.ravel()) average_precision["micro"] = average_precision_score(y_test, y_score, average="micro") #This score corresponds to the area under the precision-recall curve. # Plot Precision-Recall curve for each class plt.clf()#clf 函數用於清除當前圖像窗口 plt.plot(recall["micro"], precision["micro"], label='micro-average Precision-recall curve (area = {0:0.2f})'.format(average_precision["micro"])) for i in range(n_classes): plt.plot(recall[i], precision[i], label='Precision-recall curve of class {0} (area = {1:0.2f})'.format(i, average_precision[i])) plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) #xlim、ylim:分別設置X、Y軸的顯示范圍。 plt.xlabel('Recall', fontsize=16) plt.ylabel('Precision',fontsize=16) plt.title('Extension of Precision-Recall curve to multi-class',fontsize=16) plt.legend(loc="lower right")#legend 是用於設置圖例的函數 plt.show()
第二講 特征工程
2.1 特征工程
什么是特征工程?
引自知乎: “數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。
深度學習也要用到 特征,需要對 輸入的特征 進行 組合變換等處理。
2.11 自動分詞
- 自動分詞:就是將用自然語言書寫的文章、句段經計算處理后,以詞為單位 給以輸出,為后續加工處理提供先決條件。
- 詞形規范化 的兩種形式:詞根提取與詞形還原
- 詞根提取( stemming):是抽取詞的詞干或詞根形式(不一定能夠表達完整語義)。
- 詞形還原( lemmatization):是把詞匯還原為一般形式(能表達完整語義)。如將“ drove"處理為"drive"。
2.12 詞性標注
-
詞性標注 (part-of- speech tagging):
-
是指為分詞結果中的 每個單詞 標注一個正確的詞性的程序
-
也即確定每個詞是 名詞、動詞、形容詞
-
2.13 句法分析
句法分析( Syntactic analysis):
其基本任務是確定句子的 句法結構 或者 句子中詞匯之間的 依存關系。
2.14 自然語言處理工具
-
NLTK
Natural Language Toolkit(自然語言處理工具包)是在NLP領域中最常用的一個 Python庫。
提供了很多文本處理的功能:
Tokenization(詞語切分,單詞化處理)
Stemming(詞干提取)
Tagging(標記,如詞性標注)
Parsing(句法分析)
此外,還提供了50多種語料和詞匯資源的接口,如 Word Net等。
-
Text Processing API
支持如下功能:
詞根提取與詞形還原( Stemming& Lemmatization)
情感分析( Sentiment Analysis)
詞性標注和語塊抽取( Tagging and chunk Extraction)
短語抽取和命名實體識別( Phrase Extraction& Named Entity Recognition)
與NLTK不同,Text Processing API的使用無需安裝程序,只需將輸入的文本信息通過http post方式聯網傳遞給該網絡接口即可。
-
TextBlob工具
-
中文處理工具 jieba
功能:
分詞(包括並行分詞、支持自定義詞典)
詞性標注
關鍵詞提取
2.2 向量空間模型及文本相似度計算
2.21 文檔的向量化表示:BOW假設和VSM模型
為了便於計算文檔之間的相似度,需把 文檔轉成統一空間的向量
- BOW(bag- of-words model):為了計算文檔之間的相似度,假設可以忽略文檔內的單詞順序和語法、句法等要素,將其僅僅看作是若干個詞匯的集合。
VSM( Vector space model):即向量空間模型。其是指在BOW詞袋模型假設下,將每個文檔表示成同一向量空間的向量。
- 舉例:
2.22 停用詞
英文名稱: Stop words
停用詞通常是非常常見且實際意義有限的詞, 如英文中“the",“a", "of",“an”等;中文中“的”、“是”、“而且”等。幾乎可能出現在所有場合,因而對某些應用如信息檢索、文本分類等區分度不大。
在信息檢索等應用中,這些詞在構建向量空間時通常會被過濾掉。因此這些詞也被稱為停用詞。
Tip:但在某些應用如短語搜索 phrase search中,停用詞可能是重要的構成部分,因此要避免進行停用詞過濾。
2.23 N-gram模型
- N-gram:
- N-gram 是一個基於概率的判別模型,它的輸入是一句話(單詞的順序序列),輸出是這句話的概率,即這些單詞的聯合概率(joint probability)。
- N-gram本身也指一個由 N 個單詞組成的集合,各單詞具有先后順序,且不要求單詞之間互不相同。
- 通常是指 一段文本或語音中連續N個項目(item)的序列。項目(item)可以是單詞、字母、鹼基對等。
N=1 稱為 uni-gram,N=2 稱為 bi-gram,N=3 稱為 tri-gram,以此類推。
- 舉例:對於文本 'And I also like to eat apple'
- Uni-gram: And, I, also, like, to, eat, apple
- Bi-gram:And l, I also, also like, like to, to eat, eat apple
- Tri-gram:And I also, I also like, also like to, like to eat, to eat apple
20世紀80年代,N-gram被廣泛地應用在 拼寫檢查、輸入法 等應用中,90年代以后,N-gram得到新的應用,如自動分類信息檢索等。即將 連續的若干詞作為VSM中的維度,用於表示文檔。
2.24 文檔之間的歐式距離
歐氏距離( euclidean metric) 是一個通常采用的距離定義,指在n維空間中兩個點之間的真實距離。
- 公式:$d_{12} = \sqrt{\sum_{k=1}^n (x_{1k} - x_{2k})^2}$
2.25 文檔之間的余弦相似度
- 通過計算 兩個向量的夾角余弦值 來評估他們的相似度。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似。
$cos(\theta) = \frac{\sum_{k=1}^n(x_{1k} \times x_{2k} )}{\sqrt{{\sum_{k=1}^n}(x_{1k})^2}\times \sqrt{{\sum_{k=1}^n}(x_{2k})^2}} = \frac{x_1 \cdot x_2}{||x_1||\times||x_2||}$
2.26 Ti-idf詞條權重計算
背景:特征向量 里某些高頻詞在文集內其他文檔里面也經常出現。它往往太普遍,對區分文檔起的作用不大。
例如:
D1:' Jobs was the chairman of Apple Inc.',
D2: 'I like to use apple computer',
這兩個文檔都是關於蘋果電腦的,則詞條 apple對分類意義不大。因此 有必要抑制 那些 在很多文檔中都出現了的詞條的權重。
在 $tf-idf$ 模式下,詞條t 在文檔d中的權重計算為 $w(t)=tf(t, d) * idf(t)$。
$tf(t,d)$:表示為 詞條t 在 文檔d 中的出現頻率
- 通過統計得到
$idf(t)$ :表示與包含詞條t 的文檔數目成反比 (inverse document frequency)
$idf(t) = (log\frac{n_d}{1+df(t)} + 1)$
- $n_d$:表示文檔總數,$df(t)$:表示 包含該詞條t 的文檔數
(optional) 數據平滑問題:為了防止分母 $df(t)$ 為零
$idf(t) = (log\frac{1+n_d}{1+df(t)} + 1)$
- $tf-idf$詞條權重計算 舉例:
2.3 特征處理(特征縮放、選擇及降維)
2.31 特征值的縮放
特征值縮放( Feature scaler)也可以稱為 無量綱處理。主要是對每個列,即同一特征維度的數值進行規范化處理。
應用背景:
不同特征(列)可能不屬於同一量綱,即特征的規格不一樣。例如,假設特征向量由兩個解釋變量構成,第一個變量值范圍[0,1],第二個變量值范圍[0,100]。
如果某一特征的方差數量級較大,可能會主導目標函數,導致其他特征的影響被忽略。
常用方法:
- 標准化法
前提:特征值服從正態分布
- 需要計算特征的 均值X.mean 和 標准差X.std:
$X_{scale} = \frac{(X(axis=0) - X.mean(axis=0))}{X.std(axis=0)}$
- 標准差(Standard Deviation),又稱均方差
用 $\sigma$ 表示,是方差的算術平方根。$\sigma = \sqrt{{\frac{1}{N}\sum_{i=0}^{N-1}(x_i - \mu)}^2 }$
標准差:反應一個數據集的離散程度。
例如兩組數的集合{0,5,9,1,4}和{5,6,8,9}其平均值都是7,但第二個集合具有較小的標准差。
區間縮放法
- 區間縮放法利用了 邊界值信息,將 特征的取值區間 縮放到某個特定范圍。假設max和min為希望的調整后范圍,則
$X_{scaled} = \frac{(X(axis=0) - X.min(axis=0))}{(X.max(axis=0) - X.min(axis=0))} *(max - min)+min $
- 由於希望的調整后范圍一般為[0, 1]。此時,公式變為:
$X_{scaled} = \frac{(X(axis=0) - X.min(axis=0)) }{(X.max(axis=0) - X.min(axis=0))}$
2.32 特征值的歸一化
或稱規范化(Normalizer)
歸一化是依照 特征矩陣的 行(即樣本)處理數據
其目的在於 樣本向量 在 點乘運算 或 計算相似性時,擁有統一的標准
也就是說 都轉化為“單位向量”。即使每個樣本的范式(norm)等於1。
規則為L1 norm 的 歸一化 公式如下:
$x^{'} = \frac{x}{\sum_{j=0}^{n-1}|x_j|}$
規則為 L2 norm 的 歸一化 公式如下:
$x^{'} = \frac{x}{\sum_{j=0}^{n-1}x_j^2}$
2.33 定量特征的二值化
應用背景:
- 對於某些定量特征,需要 將 定量信息 轉為 區間划分。如將考試成績轉為“及格”或“不及格”
方法:
- 設定一個閾值,大於或者等於閾值的賦值為1,小於閾值的賦值為0,公式表達:
$$
x^{'} =
\begin{cases}
1, x>=threshold \\
0, x < threshold
\end{cases}
$$
2.34 缺失特征值的彌補計算
背景:
- 數據獲取時,由於某些原因缺少某些數值,需要進行彌補。
常見的彌補策略:
- 利用 同一特征 的 均值 進行彌補。
舉例:counts=[[1,0,1],
[2,0,0],
[3,0,0],
[NaN,0,0]]
則,NaN可以彌補為同列上其他數據的均值,即(1+2+3)/3=2
2.35 創建多項式特征
2.36 特征選擇
- 什么是特征選擇?選擇對於學習任務(如分類問題)有幫助的若干特征。
-
為什么要進行特征選擇?
-
-
降維以提升模型的效率
-
降低學習任務難度
-
增加模型的可解釋性。
-
- 特征選擇的角度:
-
-
特征是否發散:對於不發散的特征,樣本在其維度上差異性較小
-
特征與目標的相關性:應當優先選擇與目標 相關性高的特征
-
- 幾種常見的特征選擇方法:
- 方差選擇法
原理:方差非常小的特征維度,對於樣本的區分作用很小,可以剔除。
例如,假設數據集為布爾特征,想去掉那些,超過80%情況下為1或者為0的特征。由於布爾特征是 Bernoulli(伯努利)隨機變量,其方差可以計算為Var[x]=p*(1-p),因此閾值為0.8*(1-0.8)=0.16
皮爾森相關系數法
皮爾森相關系數( Pearson correlation coefficient):顯示兩個隨機變量之間線性關系的強度和方向。
計算完畢后,可以將與目標值相關性較小的特征過濾掉。
Tip: Pearson相關系數,對線性關系比較敏感。如果關系是非線性的,即便兩個變量具有一一對應的關系,Pearso相關性也可能會接近0。
基於森林的特征選擇法
其原理是某些分類器,自身提供了特征的重要性分值。因此可以直接調用這些分類器,得到特征重要性分值,並排序。
遞歸特征消除法
首先在初始特征或者權重特征集合上訓練。通過學習器返回的coef_屬性或者 feature_ importances_屬性來獲得每個特征的重要程度
然后最小權重的特征被移除。
這個過程遞歸進行,直到希望的特征數目滿足為止。
2.37 特征降維
降維本質上是從一個維度空間映射到另一個維度空間。
常見特征降維方法:
線性判別分析( (Linear Discriminant analysis,簡稱LDA)是一種 監督學習 的降維技術,即數據集的每個樣本有類別輸出。
LDA的基本思想: “投影后類內方差最小,類間方差最大”。
即將數據在 低維度 上進行投影,
投影后希望 同類數據的投影點盡可能接近,
而 不同類數據 的 類別中心 之間的 距離盡可能的大。(右圖好)
主成分分析( principal component analysis)是一種 無監督的降維方法。
采用數學變換,把給定的一組相關特征維度,
通過 線性換轉 成另一組不相關的維度(即 principal components),
這些新的維度照 方差 依次遞減的順序排列:形成第一主成分、第二主成分等。
應用:高維數據在二維平面上進行展示。
2.4 實例:使用sklearn對文檔進行向量化
# -*- coding: utf-8 -*- """ Created on Tue Jun 2 15:45:18 2020 @author: douzi """ """ 演示內容:文檔的向量化 """ from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Jobs was the chairman of Apple Inc., and he was very famous', 'I like to use apple computer', 'And I also like to eat apple' ] #未經停用詞過濾的文檔向量化 vectorizer =CountVectorizer() print(vectorizer.fit_transform(corpus).todense()) #轉化為完整特征矩陣 print(vectorizer.vocabulary_) print(" ") #經過停用詞過濾后的文檔向量化 import nltk nltk.download('stopwords') # 沒有這個文件,就需要下載 stopwords = nltk.corpus.stopwords.words('english') print (stopwords) print(" ") vectorizer =CountVectorizer(stop_words='english') print("after stopwords removal:\n", vectorizer.fit_transform(corpus).todense()) print("after stopwords removal:\n", vectorizer.vocabulary_) print(" ") #采用ngram模式進行文檔向量化 vectorizer =CountVectorizer(ngram_range=(1,2)) #表示從1-2,既包括unigram,也包括bigram print("N-gram mode:\n",vectorizer.fit_transform(corpus).todense()) #轉化為完整特征矩陣 print(" ") print("N-gram mode:\n",vectorizer.vocabulary_)
標准化和區間縮放法)
# -*- coding: utf-8 -*- """ 演示內容:量綱的特征縮放 (兩種方法:標准化縮放法和區間縮放法。每種方法舉了兩個例子:簡單二維矩陣和iris數據集) """ #方法1:標准化縮放法 例1:對簡單示例二維矩陣的列數據進行 from sklearn import preprocessing import numpy as np #采用numpy的array表示,因為要用到其mean等函數,而list沒有這些函數 X = np.array([[0, 0], [0, 0], [100, 1], [1, 1]]) # calculate mean X_mean = X.mean(axis=0) # 計算每一列的平均值 # calculate variance X_std = X.std(axis=0) # 計算每一列的標准差 #print (X_std) # standardize X X1 = (X-X_mean)/X_std print (X1) print ("") # we can also use function preprocessing.scale to standardize X X_scale = preprocessing.scale(X) print (X_scale) #方法1: 標准化縮放法 例2:對iris數據二維矩陣的列數據進行。這次采用一個集成的方法StandardScaler from sklearn import datasets iris = datasets.load_iris() X_scale = preprocessing.scale(iris.data) print (X_scale) #方法2: 區間縮放法 例3:對簡單示例二維矩陣的列數據進行 from sklearn.preprocessing import MinMaxScaler data = [[0, 0], [0, 0], [100, 1], [1, 1]] scaler = MinMaxScaler() print(scaler.fit(data)) print(scaler.transform(data)) #方法2: 區間縮放法 例4:對iris數據二維矩陣的列數據進行 from sklearn.preprocessing import MinMaxScaler data = iris.data scaler = MinMaxScaler() print(scaler.fit(data)) print(scaler.transform(data))