データサイエンスのための 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 を見たことがありますか?

推薦する

...

ChatGPT Civilization Simulator が再びオンラインになりました!クリックひとつで、火山噴火の日の古代都市ポンペイにタイムスリップ

GPT-4のアップデート機能により、AIを使って歴史をシミュレートすることは、単なる「テキストロール...

Google、チャットボットデータ分析プラットフォーム「Chatbase」の開設を発表

[[210402]]アメリカのテクノロジーブログ「VentureBeat」によると、11月17日、G...

建物をスマートかつ持続可能なものに変える重要性

[[428632]]温室効果ガス削減目標と規制要件を満たすには、企業は施設をエネルギー効率の高いスマ...

...

...

人工知能は人間の言語を習得したのか?見た目は騙されることがある

[[247418]]人工知能の分野における成果は、誤解されやすく、過大評価されやすい。このことは、人...

...

パイプラインロボットは都市の安全を守り、夏の雷雨も恐れない

夏がまたやって来て、雷雨がまた虫を追い払います。最近では、夏の気温が上昇し続けているため、雨天が多く...

アルゴリズムに関する漫画: コンシステント・ハッシュとは何ですか?

1年前——同システムでは、今後2年間で総注文数が約1億件に達すると予測している。 1 つの MyS...

DeepMindの最新研究がNatureに掲載され、AI時代の科学研究の新たなパラダイムを明らかにし、未知の領域を探索し、新たな課題をもたらしている。

AIがさまざまな科学分野と融合するにつれ、可能性と課題に満ちた技術革命が起こっています。 AI は...

ボストン・ダイナミクスのロボット犬はまもなく腕が生え、走って充電できるようになる

ボストン・ダイナミクスの創業者マーク・レイバート氏は、スポットロボット犬は将来「家庭で使用できるよう...

...

Microsoft Office Family Bucket Edition GPT-4 の価格は月額 30 ドル、Azure は Llama 2 と提携

ここ数カ月、国内外のテクノロジー大手は大規模モデルをめぐって動きを見せているが、OpenAIを所有す...