內(nèi)容摘入自<<Python大數(shù)據(jù)分析從入門到精通>>
信息熵-熵的計算
- 信息熵:常被用來作為一個系統(tǒng)的信息含量的量化指標(biāo),從而可以進一步用來作為系統(tǒng)方程優(yōu)化的目標(biāo)或者參數(shù)選擇的判據(jù),
可以作為一個系統(tǒng)復(fù)雜程度的度量,如果系統(tǒng)越復(fù)雜,出現(xiàn)不同情況的種類越多,那么他的信息熵是比較大的。

- 信息熵的三個性質(zhì)
- 單調(diào)性,即發(fā)生概率越高的事件,其所攜帶的信息熵越低
- 非負(fù)性,即信息熵不能為負(fù)
- 累加性,即多隨機事件同時發(fā)生存在的總不確定性的量度是可以表示為各事件不確定性的量度的和
可以發(fā)現(xiàn),上述的公式中計算是相當(dāng)與 將所有的期望值相加了。
設(shè)想:在一個封閉系統(tǒng)的盒子中,其中有各種的信息源,這些信息源間,可能相互關(guān)聯(lián),或彼此獨立。現(xiàn)在從這個盒子外部看接受信息。
對于單調(diào)性 : 如果 盒子中只有一個數(shù)據(jù)源,每次都可以確定信息,這樣對應(yīng)的必然事件,對應(yīng)的概率是1,對于熵值為0 。
累加性:如果盒子中有很多數(shù)據(jù)源,兩個獨立數(shù)據(jù)源發(fā)生時的概率:P(A)*P(B) ;兩個關(guān)聯(lián)事件發(fā)生的條件概率為 P(A|B) = P(A∩B)/P(B)
可以發(fā)現(xiàn)需要間概率計算中的乘除轉(zhuǎn)為為可以進行累加,所以使用對數(shù)進行處理,這樣可以將概率計算中的乘除化解為加減。
結(jié)合概率統(tǒng)計中概率計算
概率計算及相關(guān)
決策樹-Decision Tree
由于隨機森林是由很多的決策樹構(gòu)成的,所以在使用隨機森林模型前,先了解決策樹中的構(gòu)建過程,有助于對隨機森林的學(xué)習(xí)
- 使用如下測試表中的數(shù)據(jù)來說明:
| 年齡段 | 是否購車 | 是否購房 | 薪資水平 | 貸款額度 |
|---|---|---|---|---|
| 中年 | 是 | 是 | 高 | 高 |
| 少年 | 是 | 是 | 中等 | 高 |
| 青年 | 是 | 是 | 中等 | 低 |
| 中年 | 否 | 是 | 高 | 高 |
| 青年 | 是 | 是 | 高 | 低 |
| 少年 | 否 | 是 | 低 | 高 |
| 少年 | 否 | 否 | 低 | 低 |
| 中年 | 否 | 否 | 低 | 高 |
| 少年 | 否 | 是 | 中等 | 高 |
| 青年 | 否 | 是 | 低 | 高 |
| 青年 | 是 | 否 | 高 | 低 |
| 少年 | 是 | 否 | 中等 | 低 |
| 青年 | 否 | 否 | 中等 | 高 |
| 中年 | 是 | 否 | 中等 | 高 |
- 對于決策樹的計算中,需要使用到熵
為了能夠計算目標(biāo)變量-貸款額度,需要計算每類的概率,然后使用熵公式進行計算。
高貸款額度概率 : 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
用同樣的方式,計算各個特征的熵值: E(年齡) = 0.69 ; E(購車) = 0.79 ; E(購房) = 0.89 ; E(薪資) = 0.91
- 信息增益
在信息增益中,衡量標(biāo)準(zhǔn)是看特征能夠為分類系統(tǒng)帶來多少信息,帶來的信息越多,該特征越重要。對一個特征而言,系統(tǒng)有它和沒它時信息量將發(fā)生變化,而前后信息量的差值就是這個特征給系統(tǒng)帶來的信息量。
IG(年齡段) = E(貸款額度) - E(年齡段)
= 0.94 - 0.69
= 0.25
IG(購車) = E(貸款額度) - E(購車)
= 0.94 - 0.79
= 0.15
IG(購房) = E(貸款額度) - E(購房)
= 0.94 - 0.89
= 0.05
IG(薪資) = E(貸款額度) - E(薪資)
= 0.94 - 0.91
= 0.03
通過求解信息增益量,可以發(fā)現(xiàn)年齡信息增益量最大,所以其作為決策樹的root
所以最后的決策樹樣子應(yīng)該是這樣的:

隨機森林
知道決策樹是如何工作的后,可以轉(zhuǎn)向隨機森林。正如名字所暗示的,隨機森林是由許多樹組成的,許多決策樹。
隨機森林也可以用于分類和回歸。名字“隨機”的原因是,因為樹的形成是隨機的,集合的特性和隨機的訓(xùn)練?,F(xiàn)在每個
決策樹接受不同數(shù)據(jù)點的訓(xùn)練試圖學(xué)習(xí)輸入和輸出之間的關(guān)系,最終實現(xiàn)了這一點與其他使用其他決策樹的預(yù)測相結(jié)合
一組數(shù)據(jù)點被訓(xùn)練,因此是隨機森林。
測試用數(shù)據(jù)

示例代碼
from pyspark.sql import SparkSession
spark=SparkSession.builder.appName('random_forest').getOrCreate()
print('-----------讀取用于測得數(shù)據(jù),檢測數(shù)據(jù)質(zhì)量和相關(guān)的特征。即相對數(shù)據(jù)有一定的認(rèn)識,對后續(xù)進行邏輯回歸訓(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)計,會對各列按 平均值,方差,最小值,最大值 , 函數(shù)統(tǒng)計 這幾個統(tǒng)計量來進行統(tǒng)計。
df.groupBy('故障').count().show() # 以故障匯總數(shù)據(jù)
df.groupBy('地區(qū)').count().show() # 以所在地進行匯總數(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() # 計算均值
print('-----------數(shù)據(jù)轉(zhuǎn)換,將所有的特征值放到一個特征向量中,預(yù)測值分開.劃分?jǐn)?shù)據(jù)用于模型------------------')
from pyspark.ml.feature import VectorAssembler #一個 導(dǎo)入VerctorAssembler 將多個列合并成向量列的特征轉(zhuǎn)換器,即將表中各列用一個類似list表示,輸出預(yù)測列為單獨一列。
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ù)和測試數(shù)據(jù)分為75%和25%
train_df.groupBy('故障').count().show()
test_df.groupBy('故障').count().show()
print('-----------使用隨機深林進行數(shù)據(jù)訓(xùn)練----------------')
from pyspark.ml.classification import RandomForestClassifier
rf_classifier=RandomForestClassifier(labelCol='故障',numTrees=50).fit(train_df) # numTrees設(shè)置隨機數(shù)的數(shù)量為50,還有其他參數(shù):maxDepth 樹深;返回的模型類型為:RandomForestClassificationModel
rf_predictions=rf_classifier.transform(test_df)
print('{}{}'.format('評估每個屬性的重要性:',rf_classifier.featureImportances)) # featureImportances : 評估每個功能的重要性,
rf_predictions.select(['probability','故障','prediction']).show(10,False)
print("------查閱pyspark api,沒有發(fā)現(xiàn)有訓(xùn)練準(zhǔn)確率的字段,所以還需要計算預(yù)測的準(zhǔn)確率------")
from pyspark.ml.evaluation import BinaryClassificationEvaluator # 對二進制分類的評估器,它期望兩個輸入列:原始預(yù)測值和標(biāo)簽
from pyspark.ml.evaluation import MulticlassClassificationEvaluator # 多類分類的評估器,它期望兩個輸入列:預(yù)測和標(biāo)簽
rf_accuracy=MulticlassClassificationEvaluator(labelCol='故障',metricName='accuracy').evaluate(rf_predictions)
print('MulticlassClassificationEvaluator 隨機深林測試的準(zhǔn)確性: {0:.0%}'.format(rf_accuracy))
rf_auc=BinaryClassificationEvaluator(labelCol='故障').evaluate(rf_predictions)
print('BinaryClassificationEvaluator 隨機深林測試的準(zhǔn)確性: {0:.0%}'.format(rf_auc))
print('-----------保持模型,用于下次使用----------------')
rf_classifier.save("RF_model")


