1. データの前処理
ニューラル ネットワークの入力データ範囲が特に大きい場合があるため、ニューラル ネットワークの収束が遅く、学習時間が長くなります。したがって、ニューラル ネットワークをトレーニングする前に、データは通常前処理されます (ここでの指標はすべて利益タイプ (つまり、すべてポジティブな指標である) であると想定できます)。重要な前処理方法は正規化処理です。 [0,1] または [-1,1] 間隔にマッピングされたデータを変換します。
xxを設定しますxは正規化前のデータ、xmin と xmax、x_{min} と x_{max}、バツ私は_そして×マックス_ _xxのためにxの最大値と最小値;x ~ \tilde{x}バツ~は正規化されたデータ、x ˉ \bar{x}バツˉはxxですx、ssxxの場合Python で標準偏差を計算する場合、 xの標準偏差は、自由度がnnnまたはn − 1 n-1n−1 (パラメータ ddof=0 自由度はnnn、ddof=1 自由度はn − 1 n-1n−1 )
最初の正規化線形変換は次のとおりです:
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 ) ( 1−S ( x ) )
シグモイド関数曲線は次のとおりです。参考記事:シグモイド関数、百度百科
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あなた+e−うeあなた−e−あなた
機能イメージは次のとおりです。
データの前処理は一般に正規化することもできます。
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 データのみで、分類データはありません。
授業後の宿題
例 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]となります。
この記事では、Si Shoukui の数学的モデリング アルゴリズムとアプリケーションについて言及していますが、著者は txt 形式を使用しているため、データについて考える必要があります。たとえば、pandas、iloc などの構文です。