【版權(quán)聲明】本文為原創(chuàng)肌括,轉(zhuǎn)載請注明原地址 http://www.reibang.com/p/f97419da1a7a
同步更新在個人網(wǎng)站:http://www.wangpengcufe.com/machinelearning/ml-ml15/
一、公式
卡方檢驗的基本公式制圈,也就是χ2的計算公式们童,即觀察值和理論值之間的偏差
其中:A 為觀察值畔况,E為理論值鲸鹦,k為觀察值的個數(shù),最后一個式子實際上就是具體計算的方法了 n 為總的頻數(shù)跷跪,p為理論頻率馋嗜,那么n*p自然就是理論頻數(shù)(理論值)
二、相關(guān)概念
卡方分布:可以看出當觀察值和理論值十分接近的時候吵瞻,也就是我們做的假設(shè)是正確的時候葛菇,χ2的值就越趨近于0,也就是說我們計算的偏差越小橡羞,那么假設(shè)值就越可能是對的眯停,反之偏差值越大,假設(shè)值就越不準確卿泽。那么到底多大才算不準確莺债,有沒有個衡量的數(shù)值標準呢?答案是有:卡方分布。
卡方檢驗是以χ2分布為基礎(chǔ)的一種常用假設(shè)檢驗方法齐邦。若k 個隨機變量Z1椎侠、……、Zk 相互獨立措拇,且數(shù)學期望為0杆勇、方差為 1(即服從標準正態(tài)分布)帖汞,則隨機變量X被稱為服從自由度為 k 的卡方分布,記作
,卡方分布的公式為:
自由度:自由度指的是計算某一統(tǒng)計量時杏死,取值不受限制的變量個數(shù)。通常df=n-k嵌莉。其中n為樣本數(shù)量苛茂,k為被限制的條件數(shù)或變量個數(shù)。自由度v=(行數(shù)-1)(列數(shù)-1)族操。
自由度與卡方分布的關(guān)系:
如圖
圖中的Freedom 這里有5條線苛坚,分別對應(yīng)Freedom=1, 4, 10, 20 , 100 。這個Freedom 就是自由度色难,即個式子中獨立變量的個數(shù)泼舱。 x 橫坐標是卡方檢驗公式計算出來的偏差χ2,而 y 縱坐標表示假設(shè)的正確的概率枷莉。當自由度為1時娇昙,卡方分布式一個傾斜的曲線,當自由度逐漸增大是笤妙,卡方分布逐步變的平緩冒掌。在一定范圍內(nèi),隨著自由度越來越大蹲盘,卡方分布會越來越接近正態(tài)分布股毫。
三、利用卡方檢驗用來特征選擇
特征選擇(Feature Selection):指的是在特征向量中選擇出那些“優(yōu)秀”的特征召衔,組成新的铃诬、更“精簡”的特征向量的過程。它在高維數(shù)據(jù)分析中十分常用苍凛,可以剔除掉“冗余”和“無關(guān)”的特征趣席,提升學習器的性能。
特征選擇方法和分類方法一樣醇蝴,也主要分為有監(jiān)督(Supervised)和無監(jiān)督(Unsupervised)兩種宣肚,卡方選擇則是統(tǒng)計學上常用的一種有監(jiān)督特征選擇方法,它通過對特征和真實標簽之間進行卡方檢驗悠栓,來判斷該特征和真實標簽的關(guān)聯(lián)程度霉涨,進而確定是否對其進行選擇弧呐。
對于建立模型而言并非特征越多越好,因為建模的目標是使用盡量簡單的模型去實現(xiàn)盡量好的效果嵌纲。減少一些價值小貢獻小的特征有利于在表現(xiàn)效果不變或降低度很小的前提下俘枫,新找到最簡單的模型。
那么什么樣的特征是價值小的呢逮走?想想我們之所以用機器學習的模型去學習特征鸠蚪,是為了更好地預測被特征影響著的應(yīng)變量(標簽)。那么那些根本不會對應(yīng)變量產(chǎn)生影響师溅,或者影響很小的特征理應(yīng)事先去掉茅信。
那么怎么判斷特征對應(yīng)變量的影響程度的大小呢?我們可以使用卡方檢驗對特征與應(yīng)變量進行獨立性檢驗墓臭,如果獨立性高蘸鲸,那么表示兩者沒太大關(guān)系,特征可以舍棄窿锉;如果獨立性小酌摇,兩者相關(guān)性高,則說明該特征會對應(yīng)變量產(chǎn)生比較大的影響嗡载,應(yīng)當選擇窑多。
卡方檢驗在實際應(yīng)用到特征選擇中的時候,不需要知道自由度洼滚,也不用知道卡方分布埂息,只需要根據(jù)算出來的χ2 進行排序即可,值越大越好遥巴。挑選最大的一堆千康,就完成了利用卡方檢驗來進行特征提取。
四铲掐、代碼實現(xiàn)
和ML庫中的大多數(shù)學習方法一樣拾弃,ML中的卡方選擇也是以estimator+transformer的形式出現(xiàn)的,其主要由ChiSqSelector和ChiSqSelectorModel兩個類來實現(xiàn)迹炼。
1砸彬、首先引入相關(guān)需要用的包
import java.util.Arrays;
import java.util.List;
import org.apache.spark.ml.feature.ChiSqSelector;
import org.apache.spark.ml.feature.ChiSqSelectorModel;
import org.apache.spark.ml.linalg.VectorUDT;
import org.apache.spark.ml.linalg.Vectors;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
2、接下來獲取spark
SparkSession spark = SparkSession.builder().appName("ChiSqSelectorTest").master("local").getOrCreate();
3斯入、然后,我們構(gòu)造一個數(shù)據(jù)集DataFrame:
List<Row> rawData = Arrays.asList(RowFactory.create(1, Vectors.dense(0.0, 0.0, 18.0, 1.0), 1),
RowFactory.create(2, Vectors.dense(0.0, 1.0, 12.0, 0.0), 0),
RowFactory.create(3, Vectors.dense(1.0, 0.0, 15.0, 0.1), 0));
StructType schema = new StructType(new StructField[] {
new StructField("id",DataTypes.IntegerType,false,Metadata.empty()),
new StructField("features",new VectorUDT(),false,Metadata.empty()),
new StructField("label",DataTypes.IntegerType,false,Metadata.empty())
});
Dataset<Row> df = spark.createDataFrame(rawData,schema);
df.show(false);
打印結(jié)果:
+---+------------------+-----+
|id |features |label|
+---+------------------+-----+
|1 |[0.0,0.0,18.0,1.0]|1 |
|2 |[0.0,1.0,12.0,0.0]|0 |
|3 |[1.0,0.0,15.0,0.1]|0 |
+---+------------------+-----+
4蛀蜜、接著我們開始用卡方選擇進行特征選擇器的訓練
ChiSqSelector select = new ChiSqSelector().setNumTopFeatures(1)
.setFeaturesCol("features")
.setLabelCol("label")
.setOutputCol("selected-feature");
ChiSqSelectorModel selectModel = select.fit(df);
Dataset<Row> result = selectModel.transform(df);
result.show(false);
numTopFeatures:用來設(shè)置固定的提取特征的數(shù)量刻两,程序會根據(jù)卡方值的高低返回前n個卡方值最高的特征。(預測能力最強的前n個特征)滴某,默認選擇前50個特征磅摹。這里滋迈,我們設(shè)置ChiSqSelector(卡方選擇器)的numTopFeatures = 1,即在4個特征中選擇處最好的1個特征户誓。
打印結(jié)果:
+---+------------------+-----+----------------+
|id |features |label|selected-feature|
+---+------------------+-----+----------------+
|1 |[0.0,0.0,18.0,1.0]|1 |[18.0] |
|2 |[0.0,1.0,12.0,0.0]|0 |[12.0] |
|3 |[1.0,0.0,15.0,0.1]|0 |[15.0] |
+---+------------------+-----+----------------+
用訓練出的模型對原數(shù)據(jù)集進行處理饼灿,可以看見,第三列特征被選出作為最有用的特征列帝美。
參考資料: http://spark.apache.org/docs/latest/ml-features.html#chisqselector