3回目の実験
1. 実験目的
ナイーブ ベイズ アルゴリズム、デシジョン ツリー アルゴリズムなどを含む、分類アルゴリズムのアルゴリズムの概念をマスターします。分類操作用の単純ベイズ アルゴリズムを作成します。この実験は主にナイーブベイズアルゴリズムの実装に関するものであり、この実験を完了する際に、コースで学んだ決定木分類アルゴリズムの考え方も復習しました。
2. 実験原理
1. 条件付き確率とベイズの公式
条件付き確率とは、別のイベント B が発生したという条件下でイベント A が発生する確率を指し、P(A|B) として記録されます。イベント A と B の 2 つだけがある場合:
P ( A | B ) = P ( AB ) P ( B ) P(A|B) = \frac{P(AB)}{P(B)}P ( A ∣ B )=P ( B )P ( AB ) _
ベイズの公式は条件付き確率の公式から導出できます:
P ( AB ) = P ( A ∣ B ) P ( B ) P ( B ∣ A ) = P ( AB ) P ( A ) = P ( A ∣ B ) P ( B ) P ( A ) P(AB) = P(A|B)P(B)\\ P(B|A) = \frac{P(AB)}{P(A)} = \frac{ P(A|B)P(B)}{P(A)}P ( A B )=P ( A ∣ B ) P ( B )P ( B ∣ A )=P ( A )P ( AB ) _=P ( A )P ( A ∣ B ) P ( B )
ベイジアン公式は、既知のイベントのさまざまな原因の確率を見つけるためによく使用されます。
2. 単純ベイズ分類アルゴリズム
ナイーブ ベイズ分類アルゴリズムは、ベイズの定理と特徴の条件独立性の仮定に基づいた分類方法です。特定のトレーニング セットに対して、入力と出力の結合確率分布 (事前確率と条件付き確率分布) が特徴の条件付き独立性の仮定に基づいて学習されます。確率分布を学習した後、ベイズの定理を使用して出力が求められます。予測としての最大事後確率の結果。
モデルのトレーニングのプロセスは、P(Ai|B) を学習することに相当します。ここで、B は特定のカテゴリ、Ai は特徴です。この確率を計算するとき、特徴は互いに影響せず、各特徴は条件付きで独立していると仮定されます。この仮定は条件付き独立性の仮定であり、単純なベイズ法を簡素化できますが、特定の分類精度が犠牲になる可能性があります。
モデル予測のプロセスは、ベイズの公式に基づいて P(B|Ai) の確率を求めることです。つまり、各特徴の条件の下で、入力がどのカテゴリに属し、どのカテゴリにその入力が含まれるかの確率を予測します。確率が最も高い場合、入力を予測します。サンプルはどのカテゴリですか? ベイズの公式によれば、P(B|Ai) は次のように変換されます。
P ( B ∣ A i ) = P ( A i ∣ B ) P ( B ) P ( A i ) P(B|Ai) = \frac{ P (Ai|B)P(B)}{P(Ai)}P ( B ∣ A i )=P ( A i )P ( A i ∣ B ) P ( B )
各カテゴリの計算式は分母 P(Ai) を持つため、分子を計算して大きさを比較するだけでよく、条件付き独立性の仮定に従って P ( B ) P ( A 1 ∣ ) に変換されます
。 B ) P ( A 2 ∣ B ) . . P ( A n ∣ B ) P(B)P(A_1|B)P(A_2|B)..P(A_n|B)P ( B ) P ( A1∣ B ) P ( A2∣ B ) .. P ( Aん∣ B )
そして、P(Ai|B) は、モデルのトレーニング中に計算された条件付き確率です。
3. デシジョンツリーアルゴリズム
ディシジョン ツリーは予測モデルです。ツリー内の各ノードはオブジェクトを表し、各分岐パスは可能な属性値を表し、各リーフ ノードはルート ノードからリーフ ノードまでの行程に対応します。パスは完全なデータを表します。属性値に基づいて意思決定を行うプロセス。
一般的なデシジョン ツリー アルゴリズムには、ID3、C4.5、および CART アルゴリズムが含まれます。このコースの焦点は ID3 アルゴリズムです。ID3 アルゴリズムは、情報ゲインを属性選択基準として使用して、各ノードの生成に使用される属性を決定します。
情報エントロピーはデータセットの純度を測定するために使用され、次のように定義されます。
A がサンプルの属性、A の値が v で、トレーニング データ セットが V 部分に分割され、各サブセットに pi 個の正の例と ni 個の負の例があると仮定すると、条件付きエントロピーは次のように計算されます。
H ( D ∣ A ) = ∑ i = 1 vpi + nip + n H ( [ pipi + ni , nipi + ni ] ) H(D|A) = \sum_{i=1}^v\frac{pi+ni }{p+n}H([\frac{pi}{pi+ni},\frac{ni}{pi+ni}])H ( D ∣ A )=i = 1∑vp+nぴー_+それはですH ([ぴー_+でぴー_、ぴー_+でそれはです])
情報ゲインは、与えられた条件下でのセット D の情報エントロピーと特徴 A の情報条件付きエントロピーの差を指します。
Gain ( D , A ) = H ( D ) − H ( D ∣ A ) Gain(D ,A ) = H(D)-H(D|A)ゲイン( D 、_あ)=H ( D )−H ( D ∣ A )
デシジョン ツリーを構築する場合、選択されたデシジョン属性が可能な限り分類の役割を果たすことが期待されます。つまり、分類されたセットの純度が可能な限り高くなければなりません。 H(D|A) が小さいほど良いため、最大の情報利得を持つ属性が現在のレベルの分類決定として選択されます。現在のレベルでの属性選択が完了したら、残りの属性の情報利得を計算し、すべての属性が選択されるか、すべてのサンプルが分類されるまで上記のプロセスを繰り返すと、決定木全体の構築が完了します。分類するには、決定木のルート ノードから開始し、葉ノードに到達するまでノードの属性に従って左右の枝を選択するだけで、分類結果が得られます。
3.実験内容
1. ナイーブベイズアルゴリズム
A がカテゴリを表し、B、C、D が 3 つの機能を表すとします。Naive Bayes アルゴリズムの原理によれば、必要な確率は次のとおりです。
P ( A ∣ BCD ) = α P ( A ) P ( B ∣ A ) P ( C ∣ A ) P ( D ∣ A ) P(A|BCD) =αP(A)P(B|A)P(C|A)P(D|A)P ( A ∣ B C D )=α P ( A ) P ( B ∣ A ) P ( C ∣ A ) P ( D ∣ A )
トレーニング
ナイーブ ベイズ アルゴリズムで使用される条件付き確率計算結果の格納構造は次のとおりであることが合意されています。
#类别的先验概率
self.label_prob = {
类别:概率}
#每个类别下特征为某个取值的条件概率
self.condition_prob = {
}
#内部结构为:类别(好/坏):{特征编号:{特征取值:条件概率}}
使用される確率を計算するには、まずトレーニング サンプルに各カテゴリがいくつ出現するかを計算し、サンプルの合計数を割って P(A) を取得します。
#计算label_prob
cnt = 0
num = 0
for item in label:
num+=1
if item == 1:
cnt+=1
self.label_prob[0] = (num-cnt)/num
self.label_prob[1] = cnt/num
次に、初期化された 2 つのカテゴリの下に特徴量確率の辞書を保存します。
self.condition_prob[0] = {
}
self.condition_prob[1] = {
}
#初始化每个特征取值的字典
for item in self.condition_prob:
for feat in range(len(feature[0])): #len(feature[0])为特征数量
self.condition_prob[item][feat] = {
}
すべてのサンプルの特徴を調べて、各特徴の値を数えます。
i=0 #样本编号
for data in feature:
j=0 #特征序号
for feat in data:
if(self.condition_prob[0][j].get(feat)==None):
self.condition_prob[0][j][feat] = 0
if(self.condition_prob[1][j].get(feat)==None):
self.condition_prob[1][j][feat] = 0
if label[i]==0:
self.condition_prob[0][j][feat] += 1
else:
self.condition_prob[1][j][feat] += 1
j+=1
i+=1
最後に、各カテゴリのサンプル数で割って、条件付き確率を取得します。
for feat in range(len(feature[0])):
for item in self.condition_prob[0][feat]:
self.condition_prob[0][feat][item] /= (num-cnt)
for item in self.condition_prob[1][feat]:
self.condition_prob[1][feat][item] /= cnt
予測する
予測プロセスはベイズの公式に従って計算するだけでよく、カテゴリ (良い/悪い) が 2 つしかないため、個別に計算するだけで済みます:
P (A 良い) = α P (A 悪い) P (B ∣ A 不良) P ( C ∣ A 不良 ) P ( D ∣ A 不良 ) P ( A 不良 ) = α P ( A 不良 ) P ( B ∣ A 不良 ) P ( C ∣ A 不良 ) P ( D ∣ A 不良 ) P(A_{良い}) = αP(A_{悪い})P(B|A_{悪い})P(C|A_{悪い})P(D|A_{悪い}) \\ P(A_{悪い} ) = αP( A_{悪い})P(B|A_{悪い})P(C|A_{悪い})P(D|A_{悪い})P ( Aうーん_ _)=αP ( A _悪い_) P ( B ∣ A悪い_) P ( C ∣ A悪い_) P ( D ∣ A悪い_)P ( A悪い_)=αP ( A _悪い_) P ( B ∣ A悪い_) P ( C ∣ A悪い_) P ( D ∣ A悪い_)
B、C、Dの値は入力サンプルの特性値であり、予測計算のプロセスは次のとおりです。
def predict(self, feature):
'''
对数据进行预测,返回预测结果
:param feature:测试数据集所有特征组成的ndarray
:return:
'''
res = []
for item in feature:
P_good = self.label_prob[1]
P_bad = self.label_prob[0]
feat_idx = 0
for feat in item:
P_good *= self.condition_prob[1][feat_idx][feat]
P_bad *= self.condition_prob[0][feat_idx][feat]
feat_idx+=1
if P_good>P_bad:
res.append(1)
else:
res.append(0)
return res
2. ラプラシアンスムージング
サンプルが十分にない場合、特定の特徴を持たない分類が存在する可能性があるため、単純ベイズアルゴリズムを使用して分類する場合、この特徴が現れると、予測は不合理になります。例えば:
不良メロンのカテゴリでは、あいまいな質感の特徴を持つサンプルが存在しないため、P (あいまい|不良メロン) の確率は 0 になります。予測されたサンプルにあいまいな質感の特徴がある場合、計算された確率は不良メロンの確率となります。 0. この目的にはスムージングが必要であり、最も一般的に使用される方法はラプラシアン スムージングです。
ラプラシアン平滑化とは、N がトレーニング データ セット内のカテゴリの総数を表し、Ni がトレーニング データ セット内の i 番目の列の値の総数を表すと仮定することを指します。その後、トレーニング プロセス中に、カテゴリの確率を計算する場合は分子に 1 を加算し、分母に N を加算します。条件付き確率を計算する場合は、分子に 1 を加算し、分母に Ni を加算します。
つまり、P(Ai) は次のように修正されます:
P ( A i ) = カテゴリ A i のサンプル数 + 1 サンプル数 + NP(Ai) = \frac{カテゴリ Ai のサンプル数 + 1} {numberサンプル数 + N}P ( A i )=サンプル数+NカテゴリA iのサンプル数+1
そして、P(Bj|Ai) は次のように修正されます:
P ( B j ∣ A i ) = カテゴリが A i で特徴 B が B j + 1 であるサンプルの数 カテゴリが A i + N i であるサンプルの数(特徴Bの値カテゴリの数) P(Bj|Ai) = \frac{カテゴリがAiで、特徴BがBj+1であるサンプルの数{カテゴリがAi+Niであるサンプルの数(値の数)機能のカテゴリ B)}P ( B j ∣ A i )=カテゴリはA iのサンプル数です。+Ni (特徴Bの値の種類の数)カテゴリがA iで特徴BがB jであるサンプルの数+1
補正確率や条件付き確率が0にならないため、上記の不合理な状況を回避できます。
ラプラス平滑化原理に従って、カテゴリ確率を計算するプロセスは次のように変更されます。
cnt = 0
num = 0
for item in label:
num+=1
if item == 1:
cnt+=1
types = 2 #类别数
self.label_prob[0] = (num-cnt)+1/(num+types)
self.label_prob[1] = cnt+1/(num+types)
条件付き確率を格納するディクショナリの初期化は変更する必要がなく、次のとおりです。
self.condition_prob[0] = {
}
self.condition_prob[1] = {
}
#初始化每个特征取值的字典
for item in self.condition_prob:
for feat in range(len(feature[0])):
self.condition_prob[item][feat] = {
}
条件付き確率を計算するときは、分子と分母を調整してラプラス平滑化を実現します。
#记录每个特征的取值
i=0 #样本编号
for data in feature:
j=0 #特征序号
for feat in data:
if(self.condition_prob[0][j].get(feat)==None):
self.condition_prob[0][j][feat] = 1 #分子加一,初始化为1
if(self.condition_prob[1][j].get(feat)==None):
self.condition_prob[1][j][feat] = 1 #分子加一,初始化为1
if label[i]==0:
self.condition_prob[0][j][feat] += 1
else:
self.condition_prob[1][j][feat] += 1
j+=1
i+=1
#计算条件概率,每个特征取值 除 label为0和1的个数+特征的取值种类数
for feat in range(len(feature[0])):
for item in self.condition_prob[0][feat]:
self.condition_prob[0][feat][item] /= (num-cnt)+len(self.condition_prob[0][feat])
for item in self.condition_prob[1][feat]:
self.condition_prob[1][feat][item] /= cnt+len(self.condition_prob[1][feat])
予測プロセスは従来と変わらずベイジアンの公式に従って計算され、与えられた特徴の下で特定のカテゴリに属する確率が最も高いカテゴリが分類結果として採用されます。
3.実験結果
ラプラシアン平滑化を使用しない場合、特定のデータの予測精度は 0.8 より高くなります。ラプラシアン平滑化後、特定のデータの予測精度は 0.9 より高くなります。
4.考える質問
単純なベイズ アルゴリズムは実装が比較的簡単でパラメータがありませんが、条件付き独立性の仮定により予測の精度が犠牲になる可能性があります。
ディシジョン ツリー アルゴリズム (ID3) には枝刈り戦略がありません。情報獲得戦略では、多数の値を持つ特徴 (エントロピー値を低減できる) が優先される可能性がありますが、同様の数値を持つ特徴は、情報利得は 1 に近くなります。そして、離散分布の特性を扱うことしかできません。ID3 に基づいて、C4.5 アルゴリズムは分類属性の選択基準として情報取得率を使用し、ID3 による特徴の数の重視を回避します。また、連続特徴を枝刈りして離散化する枝刈り戦略が導入されています (隣接する 2 つのサンプルの平均を分割点として取り、各分割点を分類点として使用した場合の情報ゲインを計算します)。
サポート ベクター マシン アルゴリズムや人工ニューラル ネットワークなどのアルゴリズムでは、反復回数を増やすか学習率を下げることで、モデルのトレーニングの効果とパフォーマンスを向上させることができます。