ニューラルネットワークの応用(分類と予測) - Python

ニューラルネットワークの応用

1. データの前処理

ニューラル ネットワークの入力データ範囲が特に大きい場合があるため、ニューラル ネットワークの収束が遅く、学習時間が長くなります。したがって、ニューラル ネットワークをトレーニングする前に、データは通常前処理されます (ここでの指標はすべて利益タイプ (つまり、すべてポジティブな指標である) であると想定できます)。重要な前処理方法は正規化処理です。 [0,1] または [-1,1] 間隔にマッピングされたデータを変換します。

xxを設定しますxは正規化前のデータ、xmin と xmax、x_{min} と x_{max}バツ_そして×マックス_ _xxのためにxの最大値と最小値;x ~ \tilde{x}バツ~は正規化されたデータ、x ˉ \bar{x}バツˉはxxですxssxx場合Python で標準偏差を計算する場合、 xの標準偏差は、自由度がnnnまたはn − 1 n-1n1 (パラメータ ddof=0 自由度はnnn、ddof=1 自由度はn − 1 n-1n1 )

最初の正規化線形変換は次のとおりです:
x ~ = x − xminxmax − x min ⁡ (1) \tilde{x}=\frac{x-x_{min}}{x_{max}-x_{\ min}}\タグ{1}バツ=バツマックス_ _バツバツバツ_( 1 )

この正規化プロセスは、通常、活性化関数がシグモイド関数である場合に適用されます。

シグモイド関数:

シグモイド関数はロジスティック関数とも呼ばれます。隠れ層ニューロンの出力に使用されます。値の範囲は (0,1) です。実数を (0,1) の間隔にマッピングして使用できます。二項分類用。特徴の差が複雑な場合や、差がそれほど大きくない場合に効果が高くなります。シグモイドには活性化関数として次のような利点と欠点があります。

利点: スムーズで導出しやすい。

短所:活性化関数の計算量が多く、誤差勾配を求める逆伝播の導出では割り算が必要となり、逆伝播すると勾配が消失しやすく、深いネットワークの学習が完了できなくなる。

シグモイド関数は次の式で定義されます:
S ( x ) = 1 1 + e − x S(x)=\frac{1}{1+e^{-x}}S ( × )=1+e×1
その導関数は元の関数で表すことができます:
S ′ ( x ) = e − x ( 1 + e − x ) 2 = S ( x ) ( 1 − S ( x ) ) S^{\prime}(x)= \frac {e^{-x}}{\left(1+e^{-x}\right)^{2}}=S(x)(1-S(x))S( × )_=( 1+e×2e ×=S ( x ) ( 1S ( x ) )
シグモイド関数曲線は次のとおりです。

画像-20221209175543338

参考記事:シグモイド関数、百度百科

2 番目の正規化線形変換は次のとおりです。
x ~ = 2 x − ( xmin + x max ⁡ ) xmax − x min ⁡ = 2 ( x − x min ⁡ ) xmax − x min ⁡ − 1 (2) \tilde {x}= \frac{2x-\left( x_{min}+x_{\max} \right)}{x_{max}-x_{\min}}=\frac{2\left( x-x_{ \min} \右)}{x_{max}-x_{\min}}-1\tag{2}バツ=バツマックス_ _バツ2倍_( ×_+バツマックス)=バツマックス_ _バツ2( ×バツ)1( 2 )

上の式はデータを区間 [-1,1] にマッピングし、一般的な活性化関数はTanh ⁡ \tanhです。Tanh関数の場合

Tanh 関数は、区間( − ∞ , ∞ ) (-\infty,\infty)をとるシグモイド関数よりも一般的です。( ,)は( − 1 , 1 ) (-1,1)にマッピングされます。( 1 1 )

改公式文:
f ( u ) = eu − e − ueu + e − uf\left( u \right) =\frac{e^ue^{-u}}{e^u+e^{-u}}f( u )=eあなた+eeあなたeあなた
機能イメージは次のとおりです。

画像-20221209184829228

データの前処理は一般に正規化することもできます。
x ~ = x − x ˉ s (3) \tilde{x}=\frac{x-\bar{x}}{s}\tag{3}バツ=sバツバツˉ( 3 )

2. 参考例

我が国の上海や深圳の株式市場の上場企業には非ST企業とST企業があり、一般に非ST企業の信用格付けが高く、ST企業の信用格付けは低くなります。上場企業の信用度を効果的に評価するため、上場企業の信用評価指標は以下のように設定されています。 流動比率×1×_1バツ1、負債比率x 2 x_2バツ2、在庫回転率x 3 x_3バツ3、総資産回転率x 4 x_4バツ4、ROE x 5 x_5バツ5、EPS x 6 x_6バツ6、合計利益成長率x 7 x_7バツ7、1株当たり営業キャッシュフローx 8 x_8バツ8既知のトレーニングサンプルと判定対象のサンプルのデータを表 15.9 に示します。カテゴリの値 1 は ST 企業であることを示し、0 は ST 企業ではないことを示します。

ここにデータを入力します。「I」をクリックするだけです。私は svip です。無効ではありません。

抽出コード:6666

シリアルナンバー ×1×_1バツ1 ×2×_2バツ2 ×3×_3バツ3 × 4 ×_4バツ4 ×5×_5バツ5 ×6×_6バツ6 ×7×_7バツ7 x 8 x_8バツ8 カテゴリー
1 0.404 39.15 15.55 10.75 0.524 3.645 2.395 0.31 0
2 1.263 54.17 6.13 19.47 2.198 10.336 0.495 0.118 0
3 0.871 11.88 6.98 -18.22 0.481 16.146 6.385 0.624 0
4 1.317 20.38 13.13 57.79 0.299 19.396 1.937 0.673 0
5 0.722 9.33 10.09 10.22 0.444 2.515 17.564 0.3 0
6 -0.195 26.28 0.95 -7.59 0.292 0.596 4.78 0.015 1
7 0.329 22.76 1.74 -56.57 0.357 0.543 3.238 0.087 1
8 -0.001 269.39 -20.85 44.49 0.093 3.466 0.123 -0.329 1
9 -0.222 73.68 2.04 106.73 0.654 3.157 0.841 0.021 1
10 0.005 42.77 -4.15 -205.21 0.472 2.622 1.882 -0.048 1
11 1.564 59.86 -9.22 -313.31 0.284 1.565 1.444 -0.102 裁かれる
12 0.74 13.27 6.14 -7.3 0.554 18.406 5.631 0.482 裁かれる

解決策: ポジティブ指標 (利益指標) の場合x 1 、 x 3 、 x 4 、 x 5 、 x 6 、 x 7 、 x 8 x_1、x_3、x_4、x_5、x_6、x_7、x_8バツ1バツ3バツ4バツ5バツ6バツ7バツ8, 利用公式
x ~ = xi − ximinximax − ximin , i = 1 , 3 , 4 , 5 , 6 , 7 , 8 \tilde{x}=\frac{x_i-x_{i}^{min}}{x_{ i}^{最大}-x_{i}^{分}}、i=1,3,4,5,6,7,8バツ=バツマックス_ _バツ_バツ私はバツ_=1 3 4 5 6 7 8
データ標準化処理を行う、逆指標(コスト指標)×2×_2バツ2,利用公式
x ~ 2 = x 2 min − x 2 x 2 max − x 2 min \tilde{x}_2=\frac{x_{_2}^{min}-x_2}{x_{_2}^{max} -x_{_2}^{分}}バツ2=バツ2マックス_ _バツ2_バツ2_バツ2

データ標準化を実行します。ximinと ximax は x_{i}^{min} と x_{i}^{max} です。バツ_そして×マックス_ _データxi x_iをそれぞれ表現しますバツ私はの最小値と最大値は、

今回構築したBPニューロンネットワークは、隠れ層が1層、隠れニューロン数が30、活性化関数がシグモイド関数であり、プログラムは次のように記述されます。

注: コードが機能しない場合は、最後までスキップして考えられる解決策を確認してください。

# coding=utf-8
'''
author:chuanshana
email:[email protected]
'''
import pandas as pd
from sklearn.neural_network import MLPClassifier
import numpy as np

# 加载数据
data = pd.read_csv("D:\Pycharm\math_machine\公司数据.csv", index_col=0)
# 提取训练样本数据和待判样本数据
train_x = data.loc[:10, :]  # 这就是前9行数据
judge_data = data.loc[10:, :]  # 待判断数据
print(judge_data)
# 逐列计算最大值和最小值
x_max = train_x.max(axis=0)
x_min = train_x.min(axis=0)  # 如果axis=1就是计算每一行的最大值和最小值
print(x_max, "\n", x_min)
# 使用归一化对数据进行处理
# 注意注意,这里我们要转化一下数据类型,不然可能会报错,字符串与字符串无法使用减号
#train_x = train_x.apply(pd.to_numeric)
#x_min = x_min.apply(pd.to_numeric)
#judge_data = judge_data.apply(pd.to_numeric)
#x_max = x_max.apply(pd.to_numeric)  # 到这数据转换完毕
standardization = (train_x - x_min) / (x_max - x_min)
# 这里的x2是逆向指标,我们需要做额外的标准化:
standardization.iloc[:, 1] = (x_min[1] - train_x.iloc[:, 1]) / (x_max[1] - x_min[1])  # 到此我们的训练集数据标准化完成
y_0 = np.hstack([np.zeros(5), np.ones(5)])  # 标号值,5个0,5个1
print("训练集数据标准化已完成", "\n", standardization)
# 构造并拟合模型
model = MLPClassifier(solver="lbfgs", activation="logistic", hidden_layer_sizes=30).fit(standardization, y_0)
# 待判数据标准化
judge_data = (judge_data - x_min) / (x_max - x_min)
# 同样第二列特殊处理
judge_data.iloc[:, 1] = (x_min[1] - judge_data.iloc[:, 1]) / (x_max[1] - x_min[1])
# 进行预测
y_predict = model.predict(judge_data)
print("待判样本类别", y_predict,
      "\n", "属于各个样本的概率", model.predict_proba(standardization), "\n", "训练样本的回带正确率:",model.score(standardization, y_0))

次の結果が出力されます。

待判样本类别 [1. 1. 0.] 
属于各个样本的概率 [[9.98714907e-01 1.28509280e-03]
 [9.99936911e-01 6.30890421e-05]
 [9.99999817e-01 1.83165349e-07]
 [9.99999976e-01 2.43444948e-08]
 [9.99971586e-01 2.84135661e-05]
 [5.37581236e-05 9.99946242e-01]
 [7.15229062e-04 9.99284771e-01]
 [2.12967288e-09 9.99999998e-01]
 [4.15167133e-04 9.99584833e-01]
 [3.82928356e-06 9.99996171e-01]] 
 训练样本的回带正确率: 1.0

つまり、10 番目の会社は ST 会社であり (これは私たちにはわかっています)、11 番目の会社も ST 会社であり、12 番目の会社は ST 会社ではありません。

3. 注意すべき点

  • MLPRegressor に必要なパラメータは何ですか

    この質問はまず Chatgpt に質問させてください

    • hidden_​​layer_sizes: 各隠れ層のニューロンの数を示す整数のリスト。たとえば、hidden_​​layer_sizes=(100, 50, 25) は、ネットワークに 3 つの隠れ層が含まれており、それぞれに 100、50、および 25 のニューロンが含まれていることを示します。
    • アクティベーション: アクティベーション関数の種類を示します。デフォルトでは、MLPRegresor は、「Rectified Linear Unit」アクティベーション関数である「relu」を使用します。また、「logistic」や「tanh」などの活性化関数も選択可能です。
    • ソルバー: モデルのトレーニングに使用される最適化アルゴリズムを示します。一般的に使用される最適化アルゴリズムは、「lbfgs」、「sgd」、「adam」です。
    • alpha: L2 正則化項の係数を表す浮動小数点数。正則化は過学習を防ぐために使用される方法であり、アルファが大きいほど正則化の効果が強くなります。
    • learning_rate_init: 最適化アルゴリズムの初期学習率を表す浮動小数点数。
  • このようなエラーが発生した場合はunsupported operand type(s) for -: 'str' and 'str'、データ型の変換を検討してください。

    #train_x = train_x.apply(pd.to_numeric)
    #x_min = x_min.apply(pd.to_numeric)
    #judge_data = judge_data.apply(pd.to_numeric)
    #x_max = x_max.apply(pd.to_numeric)  # 到这数据转换完毕
    
  • pandas を使用して特定のデータ行を抽出する場合は、df.iloc[]この抽出を使用します

  • インポートしたデータは次のようになります。x1 ~ x8 データのみで、分類データはありません。

    画像-20221209204801470

授業後の宿題

例 15.12 調査によると、特定の地域の道路旅客交通量は、主にその地域の人口、自動車の台数、道路面積に関連しています。表 15.10 は、道路旅客交通量に関する関連データを示しています。 1990 年から 2009 年までの 20 年間、この地域を調査しました。関係部門のデータによると、2010 年と 2011 年のこの地域の人口はそれぞれ 733,900 人、755,500 人、自動車台数は 39,635 台、40,975 台、道路面積はそれぞれ 9,880 平方メートル、10,268 平方メートルでした。BP ニューラル ネットワークを使用して、2010 年と 2011 年のこの地域の道路旅客交通量を予測してください。

人口/万人 自動車台数/万台 道路面積/10,000km2 乗客数/10,000人
1990年 20.55 0.6 0.09 5126
1991年 22.44 0.75 0.11 6217
1992年 25.37 0.85 0.11 7730
1993年 27.13 0.9 0.14 9145
1994年 29.45 1.05 0.2 10460
1995年 30.1 1.35 0.23 11387
1996年 30.96 1.45 0.23 12353
1997年 34.06 1.6 0.32 15750
1998年 36.42 1.7 0.32 18304
1999年 38.09 1.85 0.34 19836
2000年 39.13 2.15 0.36 21024
2001年 39.99 2.2 0.36 19490
2002年 41.93 2.25 0.38 20433
2003年 44.59 2.35 0.49 22598
2004年 47.3 2.5 0.56 25107
2005年 52.89 2.6 0.59 33442
2006年 55.73 2.7 0.59 36836
2007年 56.76 2.85 0.67 40548
2008年 59.17 2.95 0.69 42927
2009年 60.63 3.1 0.79 43462

参考回答:
データアドレスリンク:https://pan.baidu.com/s/1jUsDubJUmvdiipvZdqagZw?pwd=
6666 抽出コード:6666

# coding=utf-8
'''
author:chuanshana
email:[email protected]
'''
import pandas as pd
from sklearn.neural_network import MLPRegressor
import numpy as np
import pylab as plt

data = pd.read_csv("D:\Pycharm\math_machine\神经网络\某地区公路客运量相关数据.csv", encoding="gbk", index_col=0)
# 同样提取出训练样本数据
train_data = data.iloc[:, :3]
# print(train_data)

y_data = data.iloc[:, 3]
# print(y_data)
# 计算出最大值和最小值
x_min = train_data.min(axis=0)
# print(x_min)
x_max = train_data.max(axis=0)
# print(x_max)
# 进行数据标准化,令我疑惑的一点是这里的y并没有进行标准化
standardization = 2 * ((train_data - x_min) / (x_max - x_min)) - 1
print(standardization)
# 构造并拟合模型
model = MLPRegressor(solver="lbfgs", activation="identity", hidden_layer_sizes=10,
                     ).fit(standardization, y_data)  # 这两个参数加不加values都一样
# 根据给出的数据进行预测
given_data = np.array([[73.39, 3.9635, 0.9880], [75.55, 4.0975, 1.0268]])
print(given_data)
xy_min = (x_min.values)  # 注意看这里重新计算了一下,提取上面的数值
xy_max = (x_max.values)  # 下面也是这样的
given_data_standardization = 2 * (given_data - xy_min) / (xy_max - xy_min) - 1  # 进行数据标准化
y_predict = model.predict(given_data_standardization)
print("预测的数据分别为:", np.round(y_predict, 4))  # 保留四位小数
y_0_predict = model.predict(standardization)  # 对测试集进行预测
print("原数据的预测值为:", y_0_predict)
all_predict = list(y_0_predict) + list(y_predict)
# 计算测试集预测值与真实值的误差,百分之多少
delta = abs((y_0_predict - y_data) / y_data) * 100
print("已知数据的相对误差:", np.round(delta, 4))
# 可视化:
t = np.arange(1990, 2010)
predict_t = np.arange(1990, 2012)
plt.rc("font", size=15);
plt.rc("font", family="KaiTi")
plt.plot(t, y_data, "--o", label="原始数据")
plt.plot(predict_t, all_predict, "-*", label="预测数据")
plt.xticks(predict_t, rotation=55)
plt.grid(True)
plt.legend()
plt.show()

出力される予測値は[54449.6164 56573.6837]となります。

画像-20221209224718493

この記事では、Si Shoukui の数学的モデリング アルゴリズムとアプリケーションについて言及していますが、著者は txt 形式を使用しているため、データについて考える必要があります。たとえば、pandas、iloc などの構文です。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_54423921/article/details/128260186