データサイエンスのための Python: ニューラル ネットワーク

データサイエンスのための Python: ニューラル ネットワーク

人工ニューラル ネットワーク (ANN) は、数学的および物理的な方法を使用して人間の脳のニューラル ネットワークを簡素化、抽象化、シミュレートする人工ニューラル ネットワーク モデルです。

これは、ニューロン モデルと BP ニューラル ネットワークを含む、ニューラル ネットワークの簡単な紹介です。

ここでは、機械学習の 3 つの要素であるモデル、戦略、アルゴリズムについて簡単に説明します。

モデルには、非ランダム効果部分 (説明変数と被説明変数の関係、主に機能関係) とランダム効果部分 (外乱項) が含まれます。

戦略とは、最適な目的関数を設定する方法を指します。一般的な目的関数には、線形回帰の残差二乗和、ロジスティック回帰の尤度関数、SVM のヒンジ関数などがあります。

アルゴリズムとは、微分法によって計算したり、数値計算の分野でアルゴリズムを使用して解いたりするなど、目的関数のパラメータを見つける方法です。

ニューラル ネットワークは数値アルゴリズムを使用してパラメータを解決します。つまり、計算されるモデル パラメータは毎回異なります。

1. ニューラルネットワーク

01 ニューロンモデル

ニューラル ネットワークの最も基本的なコンポーネントはニューロン モデルです。

各ニューロンは、多入力、単一出力の情報処理ユニットです。入力信号は重み付けされた接続を介して送信され、しきい値と比較して合計入力値を取得し、その後、活性化関数によって処理されて単一の出力が生成されます。

ニューロンの出力は、入力の加重合計に活性化関数を適用した結果です。

ニューロンの活性化関数は、ニューロンにさまざまな情報処理特性を与え、ニューロンの出力と活性化状態の関係を反映します。

今回取り上げる活性化関数は閾値関数(ステップ関数)とシグモイド関数(S型関数)です。

02 単層パーセプトロン

パーセプトロンは、単一層の計算ユニットを持つニューラル ネットワークであり、線形に分離可能なバイナリ分類問題を解決するためにのみ使用できます。

多層パーセプトロンには適用できず、隠れ層の予想出力を決定することはできません。

その構造は以前のニューロンモデルに似ています。

活性化関数は、単極性(または双極性)しきい値関数を使用します。

03 BPニューラルネットワーク

エラーバックプロパゲーションアルゴリズム(教師あり学習アルゴリズム)を使用してトレーニングされた多層ニューラルネットワークは、BP ニューラルネットワークと呼ばれます。

これは多層フィードフォワード ニューラル ネットワークです。モデルの学習プロセスは、信号の順方向伝播とエラーの逆方向伝播の 2 つのプロセスで構成されます。

順方向伝播中、信号は入力層から各層の加重和として計算され、最終的に各隠れ層を介して出力層に伝達され、出力結果が得られます。出力結果は、期待される結果(監視信号)と比較され、出力誤差が得られます。

エラーバックプロパゲーションは、勾配降下アルゴリズムに従って、隠れ層から入力層まで層ごとにエラーを伝播し、各層のすべてのユニットにエラーを分配して、各ユニットのエラー信号(学習信号)を取得し、それに応じて各ユニットの重みを変更します。

2 つの信号伝播プロセスは継続的に循環され、重みが更新され、最終的に判断条件に基づいてサイクルを終了するかどうかが決定されます。

そのネットワーク構造は、一般的に、入力層、隠し層、出力層を含む単一の隠し層ネットワークです。

活性化関数は通常、シグモイド関数または線形関数を使用します。ここでは、隠れ層と出力層の両方でシグモイド関数を使用します。

2. Python実装

ニューラル ネットワークに明確なトレーニング サンプルが用意された後、ネットワークの入力層のノード数 (説明変数の数) と出力層のノード数 (説明変数の数) が決定されます。

考慮する必要があるのは、隠し層の数と各隠し層内のノードの数です。

この本のデータを使用して、モバイル オフグリッド データのセットを含むいくつかの実践的な実験を実施してみましょう。

モバイル通信ユーザーの消費特性データ、対象分野は解約するかどうかで、分類レベルは 2 つ(はい、いいえ)です。

独立変数には、ユーザーの基本情報、消費された製品情報、ユーザーの消費特性が含まれます。

データを読み取ります。

  1. pandasをpdとしてインポートする
  2. sklearnからメトリックをインポート
  3. matplotlib.pyplot をpltとしてインポートします。
  4. sklearn.preprocessingからMinMaxScaler をインポートします
  5. sklearn.neural_networkからMLPClassifier をインポートします
  6. sklearn.model_selectionからGridSearchCV をインポートします
  7. sklearn.model_selectionからtrain_test_split をインポートします
  8.  
  9. # 表示する行数を設定する
  10. pd.set_option( 'display.max_rows' , 10)
  11. # 表示する列数を設定する
  12. pd.set_option( 'display.max_columns' , 10)
  13. # IDEで改行が発生しないように、表示幅を1000に設定します
  14. pd.set_option( 'ディスプレイ幅' , 1000)
  15. # データを読み取り、skipinitialspace: 区切り文字の後のスペースを無視します
  16. 解約率 = pd.read_csv( 'telecom_churn.csv' , skipinitialspace= True )
  17. 印刷(解約)

3000 を超えるユーザー データを含む出力データの概要。

scikit-learn の関数を使用して、データセットをトレーニング セットとテスト セットに分割します。

  1. # 独立変数データを選択する
  2. データ = churn.iloc[:, 2:]
  3. # 従属変数データを選択する
  4. ターゲット = churn[ 'churn' ]
  5. # scikit-learn を使用してデータセットをトレーニング セットとテスト セットに分割します
  6. train_data、test_data、train_target、test_target = train_test_split(データ、ターゲット、test_size=0.4、train_size=0.6、random_state=1234)

ニューラル ネットワークでは、データの極端な正規化が必要です。

連続変数は極端な値に標準化する必要があり、カテゴリ変数はダミー変数に変換する必要があります。

このうち、多カテゴリ名義変数はダミー変数に変換する必要がありますが、順序変数とバイナリ変数は変換しないことを選択し、連続変数として扱うことができます。

このデータでは、教育レベルやパッケージの種類は階層変数であり、性別などの変数はバイナリ変数であり、これらはすべて連続変数として扱うことができます。

これは、このデータセットには多重分類名目変数が存在せず、すべてが連続変数として扱えることを意味します。

  1. # 極値正規化
  2. スケーラー = MinMaxScaler()
  3. スケーラー.fit(train_data)
  4.  
  5. スケールされたトレーニングデータ = scaler.transform(トレーニングデータ)
  6. scaler_test_data = scaler.transform(テストデータ)

多層パーセプトロンモデルを構築します。

  1. # 多層パーセプトロンに対応するモデルを設定する
  2. mlp = MLPClassifier(hidden_​​layer_sizes=(10,)、活性化= 'logistic' 、アルファ=0.1、max_iter=1000)
  3. # トレーニングセットでモデルをトレーニングする
  4. mlp.fit(スケールされたトレーニングデータ、トレーニングターゲット)
  5. # ニューラルネットワークモデル情報を出力する
  6. 印刷(mlp)

出力モデル情報は以下の通りです。

次に、トレーニング セットでトレーニングされたモデルを使用して、トレーニング セットとテスト セットで予測を行います。

  1. # モデルを使用して予測を行う
  2. train_predict = mlp.predict(スケールされたtrain_data)
  3. test_predict = mlp.predict(scaler_test_data)

予測確率、つまりユーザー離脱の確率を出力します。

  1. # 出力モデルの予測確率(1の場合)
  2. train_proba = mlp.predict_proba(スケールされたtrain_data)[:, 1]
  3. test_proba = mlp.predict_proba(scaler_test_data)[:, 1]

モデルを評価し、評価データを出力します。

  1. # 予測情報に基づくモデル評価結果を出力する
  2. 印刷(metrics.confusion_matrix(test_target, test_predict, labels=[0, 1]))
  3. 印刷(metrics.classification_report(test_target, test_predict))

出力は次のようになります。

失われたユーザーのモデルの f1 スコア (精度と再現率の調和平均) は 0.81 であり、これは良好な結果です。

さらに、失われたユーザーに対するリコール感度は 0.83 であり、モデルは失われたユーザーの 83% を識別できるため、モデルの失われたユーザーを識別する能力が許容できることがわかります。

モデルの予測の平均精度を出力します。

  1. # 指定されたデータセットを使用してモデル予測の平均精度を出力します
  2. mlp.score(scaler_test_data, test_target) を印刷します。
  3. # 出力値は0.8282828282828283です

平均精度値は0.8282です。

モデルの ROC の下の領域を計算します。

  1. # ROC曲線を描く
  2. fpr_test、tpr_test、th_test = metrics.roc_curve(test_target、test_proba)
  3. fpr_train、tpr_train、th_train = metrics.roc_curve(train_target、train_proba)
  4. plt.figure(図のサイズ=[3, 3])
  5. plt.plot(fpr_test, tpr_test, 'b--' )は、
  6. plt.plot(fpr_train, tpr_train, 'r-' )は、
  7. plt.title( 'ROC曲線' )
  8. plt.show()
  9.  
  10. # AUC値を計算する
  11. 印刷(metrics.roc_auc_score(test_target, test_proba))
  12. # 出力値は0.9149632415075206です

ROC曲線は以下のようになります。

トレーニング セットとテスト セットの曲線は非常に近く、過剰適合現象は発生しません。

AUC 値は 0.9149 であり、モデルが非常にうまく機能していることがわかります。

モデルの *** パラメータ検索を実行し、*** パラメータでモデルをトレーニングします。

  1. # GridSearchCV を使用して *** パラメータ検索を実行します
  2. パラメータグリッド = {
  3. # モデル内の隠れ層の数
  4. '隠しレイヤーのサイズ' : [(10, ), (15, ), (20, ), (5, 5)],
  5. # 活性化関数
  6. '活性化' : [ 'ロジスティック' , 'tanh' , 'relu' ],
  7. # 正則化係数
  8. 'アルファ' : [0.001, 0.01, 0.1, 0.2, 0.4, 1, 10]
  9. }
  10.  
  11. mlp = MLP分類子(max_iter=1000)
  12. # 評価基準としてroc_auc、4分割交差検証、n_jobs=-1を選択してマルチコアCPUのすべてのスレッドを使用する
  13. gcv = GridSearchCV(推定器=mlp、param_grid=param_grid、
  14. スコアリング= 'roc_auc' 、cv=4、n_jobs=-1)
  15. gcv.fit(スケールされたトレーニングデータ、トレーニングターゲット)

最も高いパラメータを持つモデルのケースを出力します。

  1. # ***パラメータの下にあるモデルのスコアを出力します
  2. 印刷(gcv.best_score_)
  3. # 出力値は0.9258018987136855です
  4.  
  5. # ***パラメータの下のモデルのパラメータを出力します
  6. 印刷(gcv.best_params_)
  7. # 出力パラメータ値は{ 'alpha' :0.01、 'activation' : 'tanh' 'hidden_​​layer_sizes' :(5,5)}です
  8.  
  9. # 指定されたデータセットを使用してモデル予測の平均精度を出力します
  10. gcv.score を印刷します(scaler_test_data、test_target)
  11. # 出力値は0.9169384823390232です

モデルの roc_auc*** スコアは 0.92 です。つまり、このモデルの ROC 曲線の下の面積は 0.92 です。

前回の0.9149より少し高いです。

モデルの最も重要なパラメータは、relu タイプの活性化関数、アルファが 0.01、隠し層ノードの数が 15 であることです。

モデルの平均予測精度は 0.9169 で、以前の 0.8282 から大幅に改善されています。

<<:  人工知能があなたの仕事を奪い、ビッグデータがあなたを「裸」にしてしまう。私たちの未来はどうなるのでしょうか?

>>:  ダンスをしたり、音楽を作曲したり、演出したりできる AI を見たことがありますか?

ブログ    
ブログ    
ブログ    

推薦する

AIプログラミングは原作者を打ち負かす。プログラマー:私が書いたプログラムのせいで失業した

ブルームバーグとインテル研究所の研究者2人が、遺伝的アルゴリズムとチューリング完全な言語を使用して、...

...

欧州のAI法案がまもなく導入され、世界の技術規制に影響を及ぼす可能性がある

AI法案は、AIの開発方法、企業がAIを使ってできること、要件に従わなかった場合の法的結果など、A...

誇大広告か、効率か?サイバーセキュリティにおける人工知能の実用的応用

サイバーセキュリティにおける人工知能をめぐる誇大宣伝は、多くの専門家の間で不満を引き起こしています。...

自動運転高速道路の技術仕様の導入によってメリットを享受できる分野はどこでしょうか?

自動運転車を大規模に公道に導入するには、車自体が技術基準を満たしていることを確認するだけでは十分では...

人工知能の10大技術分野

[[357814]]これを読んでいるあなたは、目の前のウェブサイトから CT スキャンの読み取りまで...

トランスフォーマーに挑むマンバの起源とは?著者の博士論文はSSMの進化の道筋を明らかにしている

大型模型の分野では、トランスフォーマーが全容を一手に引き受けています。しかし、モデルのサイズが拡大し...

AI コンピューティング センター構築熱の背後で、お金を無駄にしているのは誰か?

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

PaddlePaddle パノラマビューが初めて公開され、11 の新機能とサービス ハードコア リリース

ディープラーニングが注目を集めています。 4月23日、北京で第1回WAVE SUMMIT 2019デ...

感動して泣きました。ロボットはついに自分で服をたたむことを覚えました。

人間の子どもの最も基本的な運動知能、例えばつかむ、持ち上げる、あるいはキルトや衣服をたたむといった家...

AIとIoTの長所と短所

モノのインターネットは、私たちがテクノロジーや周囲の世界と関わる方法に革命をもたらしました。 データ...

...

ライブクイズゲーム「Winning with Ease」は止められない、Baidu AIが150万の現金獲得にあなたを招待します!

「2進数では、1+1=?」答えが2の場合、残念ながら150万を逃してしまいます。これは頭​​の体操...

偽3Dシーンがリアルすぎるとネット上で人気に!死角ゼロの1億画素超え、AIレンダリングの新たな高みと称賛

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...