內(nèi)容摘入自<<Python大數(shù)據(jù)分析從入門到精通>>
信息熵-熵的計(jì)算
- 信息熵:常被用來作為一個(gè)系統(tǒng)的信息含量的量化指標(biāo)卸勺,從而可以進(jìn)一步用來作為系統(tǒng)方程優(yōu)化的目標(biāo)或者參數(shù)選擇的判據(jù),
可以作為一個(gè)系統(tǒng)復(fù)雜程度的度量,如果系統(tǒng)越復(fù)雜淹禾,出現(xiàn)不同情況的種類越多冀自,那么他的信息熵是比較大的峦剔。
- 信息熵的三個(gè)性質(zhì)
- 單調(diào)性,即發(fā)生概率越高的事件,其所攜帶的信息熵越低
- 非負(fù)性站绪,即信息熵不能為負(fù)
- 累加性蔓肯,即多隨機(jī)事件同時(shí)發(fā)生存在的總不確定性的量度是可以表示為各事件不確定性的量度的和
可以發(fā)現(xiàn),上述的公式中計(jì)算是相當(dāng)與 將所有的期望值相加了遂鹊。
設(shè)想:在一個(gè)封閉系統(tǒng)的盒子中,其中有各種的信息源蔗包,這些信息源間秉扑,可能相互關(guān)聯(lián),或彼此獨(dú)立〉飨蓿現(xiàn)在從這個(gè)盒子外部看接受信息舟陆。
對(duì)于單調(diào)性 : 如果 盒子中只有一個(gè)數(shù)據(jù)源,每次都可以確定信息耻矮,這樣對(duì)應(yīng)的必然事件秦躯,對(duì)應(yīng)的概率是1,對(duì)于熵值為0 淘钟。
累加性:如果盒子中有很多數(shù)據(jù)源宦赠,兩個(gè)獨(dú)立數(shù)據(jù)源發(fā)生時(shí)的概率:P(A)*P(B) ;兩個(gè)關(guān)聯(lián)事件發(fā)生的條件概率為 P(A|B) = P(A∩B)/P(B)
可以發(fā)現(xiàn)需要間概率計(jì)算中的乘除轉(zhuǎn)為為可以進(jìn)行累加米母,所以使用對(duì)數(shù)進(jìn)行處理勾扭,這樣可以將概率計(jì)算中的乘除化解為加減。
結(jié)合概率統(tǒng)計(jì)中概率計(jì)算
概率計(jì)算及相關(guān)
決策樹-Decision Tree
由于隨機(jī)森林是由很多的決策樹構(gòu)成的铁瞒,所以在使用隨機(jī)森林模型前妙色,先了解決策樹中的構(gòu)建過程,有助于對(duì)隨機(jī)森林的學(xué)習(xí)
- 使用如下測(cè)試表中的數(shù)據(jù)來說明:
年齡段 | 是否購(gòu)車 | 是否購(gòu)房 | 薪資水平 | 貸款額度 |
---|---|---|---|---|
中年 | 是 | 是 | 高 | 高 |
少年 | 是 | 是 | 中等 | 高 |
青年 | 是 | 是 | 中等 | 低 |
中年 | 否 | 是 | 高 | 高 |
青年 | 是 | 是 | 高 | 低 |
少年 | 否 | 是 | 低 | 高 |
少年 | 否 | 否 | 低 | 低 |
中年 | 否 | 否 | 低 | 高 |
少年 | 否 | 是 | 中等 | 高 |
青年 | 否 | 是 | 低 | 高 |
青年 | 是 | 否 | 高 | 低 |
少年 | 是 | 否 | 中等 | 低 |
青年 | 否 | 否 | 中等 | 高 |
中年 | 是 | 否 | 中等 | 高 |
- 對(duì)于決策樹的計(jì)算中慧耍,需要使用到熵
為了能夠計(jì)算目標(biāo)變量-貸款額度身辨,需要計(jì)算每類的概率丐谋,然后使用熵公式進(jìn)行計(jì)算。
高貸款額度概率 : 9/14 = 0.64
低貸款額度概率 :5/14 = 0.36
所以 熵值為 : E(貸款額度) = - P(高貸款額度) * log(2)(P(高貸款額度)) - P(低貸款額度) * log(2)(P(低貸款額度))
= -( 0.64 * log(2)(0.64)) - (0.36 * log(2)(0.36))
= -( 0.64 * -0.643856 ) - (0.36 * -1.473931)
= 0.41206784 + 0.53061516
= 0.94
用同樣的方式煌珊,計(jì)算各個(gè)特征的熵值: E(年齡) = 0.69 ; E(購(gòu)車) = 0.79 ; E(購(gòu)房) = 0.89 ; E(薪資) = 0.91
- 信息增益
在信息增益中号俐,衡量標(biāo)準(zhǔn)是看特征能夠?yàn)榉诸愊到y(tǒng)帶來多少信息,帶來的信息越多定庵,該特征越重要吏饿。對(duì)一個(gè)特征而言,系統(tǒng)有它和沒它時(shí)信息量將發(fā)生變化蔬浙,而前后信息量的差值就是這個(gè)特征給系統(tǒng)帶來的信息量猪落。
IG(年齡段) = E(貸款額度) - E(年齡段)
= 0.94 - 0.69
= 0.25
IG(購(gòu)車) = E(貸款額度) - E(購(gòu)車)
= 0.94 - 0.79
= 0.15
IG(購(gòu)房) = E(貸款額度) - E(購(gòu)房)
= 0.94 - 0.89
= 0.05
IG(薪資) = E(貸款額度) - E(薪資)
= 0.94 - 0.91
= 0.03
通過求解信息增益量,可以發(fā)現(xiàn)年齡信息增益量最大畴博,所以其作為決策樹的root
所以最后的決策樹樣子應(yīng)該是這樣的:
隨機(jī)森林
知道決策樹是如何工作的后,可以轉(zhuǎn)向隨機(jī)森林笨忌。正如名字所暗示的,隨機(jī)森林是由許多樹組成的,許多決策樹。
隨機(jī)森林也可以用于分類和回歸俱病。名字“隨機(jī)”的原因是,因?yàn)闃涞男纬墒请S機(jī)的官疲,集合的特性和隨機(jī)的訓(xùn)練。現(xiàn)在每個(gè)
決策樹接受不同數(shù)據(jù)點(diǎn)的訓(xùn)練試圖學(xué)習(xí)輸入和輸出之間的關(guān)系,最終實(shí)現(xiàn)了這一點(diǎn)與其他使用其他決策樹的預(yù)測(cè)相結(jié)合
一組數(shù)據(jù)點(diǎn)被訓(xùn)練,因此是隨機(jī)森林庶艾。
測(cè)試用數(shù)據(jù)
示例代碼
from pyspark.sql import SparkSession
spark=SparkSession.builder.appName('random_forest').getOrCreate()
print('-----------讀取用于測(cè)得數(shù)據(jù),檢測(cè)數(shù)據(jù)質(zhì)量和相關(guān)的特征袁余。即相對(duì)數(shù)據(jù)有一定的認(rèn)識(shí),對(duì)后續(xù)進(jìn)行邏輯回歸訓(xùn)練做準(zhǔn)備------------------')
# 讀取數(shù)據(jù)
df=spark.read.csv('cars.csv',inferSchema=True,header=True)
print((df.count(),len(df.columns)))
df.printSchema()
df.describe().select('summary','地區(qū)','駕駛員年齡','駕齡','每年保養(yǎng)次數(shù)','汽車類型').show() # 全景數(shù)據(jù)分析統(tǒng)計(jì)咱揍,會(huì)對(duì)各列按 平均值颖榜,方差,最小值煤裙,最大值 , 函數(shù)統(tǒng)計(jì) 這幾個(gè)統(tǒng)計(jì)量來進(jìn)行統(tǒng)計(jì)掩完。
df.groupBy('故障').count().show() # 以故障匯總數(shù)據(jù)
df.groupBy('地區(qū)').count().show() # 以所在地進(jìn)行匯總數(shù)據(jù)
df.groupBy('汽車類型','故障').count().orderBy('汽車類型','故障','count',ascending=True).show()
df.groupBy('每年保養(yǎng)次數(shù)','故障').count().orderBy('每年保養(yǎng)次數(shù)','故障','count',ascending=True).show()
df.groupBy('故障').mean().show() # 計(jì)算均值
print('-----------數(shù)據(jù)轉(zhuǎn)換,將所有的特征值放到一個(gè)特征向量中硼砰,預(yù)測(cè)值分開.劃分?jǐn)?shù)據(jù)用于模型------------------')
from pyspark.ml.feature import VectorAssembler #一個(gè) 導(dǎo)入VerctorAssembler 將多個(gè)列合并成向量列的特征轉(zhuǎn)換器,即將表中各列用一個(gè)類似list表示且蓬,輸出預(yù)測(cè)列為單獨(dú)一列。
df_assembler = VectorAssembler(inputCols=['地區(qū)', '駕駛員年齡', '駕齡', '每年保養(yǎng)次數(shù)', '汽車類型'], outputCol="features")
df = df_assembler.transform(df)
df.printSchema()
df.select(['features','故障']).show(10,False)
model_df=df.select(['features','故障']) # 選擇用于模型訓(xùn)練的數(shù)據(jù)
train_df,test_df=model_df.randomSplit([0.75,0.25]) # 訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)分為75%和25%
train_df.groupBy('故障').count().show()
test_df.groupBy('故障').count().show()
print('-----------使用隨機(jī)深林進(jìn)行數(shù)據(jù)訓(xùn)練----------------')
from pyspark.ml.classification import RandomForestClassifier
rf_classifier=RandomForestClassifier(labelCol='故障',numTrees=50).fit(train_df) # numTrees設(shè)置隨機(jī)數(shù)的數(shù)量為50,還有其他參數(shù):maxDepth 樹深;返回的模型類型為:RandomForestClassificationModel
rf_predictions=rf_classifier.transform(test_df)
print('{}{}'.format('評(píng)估每個(gè)屬性的重要性:',rf_classifier.featureImportances)) # featureImportances : 評(píng)估每個(gè)功能的重要性,
rf_predictions.select(['probability','故障','prediction']).show(10,False)
print("------查閱pyspark api题翰,沒有發(fā)現(xiàn)有訓(xùn)練準(zhǔn)確率的字段恶阴,所以還需要計(jì)算預(yù)測(cè)的準(zhǔn)確率------")
from pyspark.ml.evaluation import BinaryClassificationEvaluator # 對(duì)二進(jìn)制分類的評(píng)估器,它期望兩個(gè)輸入列:原始預(yù)測(cè)值和標(biāo)簽
from pyspark.ml.evaluation import MulticlassClassificationEvaluator # 多類分類的評(píng)估器,它期望兩個(gè)輸入列:預(yù)測(cè)和標(biāo)簽
rf_accuracy=MulticlassClassificationEvaluator(labelCol='故障',metricName='accuracy').evaluate(rf_predictions)
print('MulticlassClassificationEvaluator 隨機(jī)深林測(cè)試的準(zhǔn)確性: {0:.0%}'.format(rf_accuracy))
rf_auc=BinaryClassificationEvaluator(labelCol='故障').evaluate(rf_predictions)
print('BinaryClassificationEvaluator 隨機(jī)深林測(cè)試的準(zhǔn)確性: {0:.0%}'.format(rf_auc))
print('-----------保持模型,用于下次使用----------------')
rf_classifier.save("RF_model")