PythonとKerasのSequentialとBatchNormalization等を使って大学入学者数の予測をする

スポンサーリンク

大学教育は21世紀の社会・経済生活の重要な柱となりつつあります。

大学進学は、教育だけでなく、就職と経済的な安定という2つの面で非常に重要です。

一方、大学への入学を予測することは、生徒が入学基準を知らないため、非常に困難なことかもしれません。

そこで、この記事では、Pythonプログラミング言語を使って、独自の大学入学予測モデルを構築します。

スポンサーリンク

データセット入門

外国の修士課程に出願する場合、考慮すべき変数がいくつかあります。

特に、まともなGREのスコア、sop(志望動機書)、推薦状が必要です。

英語圏以外の出身者であれば、TOEFLのスコアも提出する必要があります。

データセットには、こちらからアクセスできます。

データセットには以下の属性が含まれる。

  1. GREスコア(340点満点)
  2. TOEFLスコア(120点満点)
  3. 大学評価(5点満点)
  4. 志望動機書と推薦状の強さ(5点満点中)
  5. 学部のGPA(10点満点)
  6. 研究経験(0点または1点)
  7. 入学の可能性 ( 0 から 1 まで )

Pythonで大学の入試対策を実装する

コード全体の実装を以下のようないくつかのステップに分けることにします。

ステップ1:必要なモジュール/ライブラリのインポート

1
2
3
4
5
6
7
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense ,Dropout,BatchNormalization
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor

ステップ2: プログラムへのデータセットのロード

df = pd.read_csv('Admission_Predict.csv')
df.head()
df=df.drop("Serial No.",axis=1)

ステップ3:データの前処理とデータの分割

メインモデルを構築する前に、モデルにとって不要なカラムを削除する前処理が必要です。

ここでは、「シリアル番号」列は入場者予測に必要ないため、データから削除します。

1
2
Y=np.array(df[df.columns[-1]])
X=np.array(df.drop(df.columns[-1],axis=1))

この後、データセットをXとYのサブデータセットに分割します。

Xにはすべての情報が含まれ、Yには最終的な確率が含まれる。

X_train, X_test, y_train, y_test = train_test_split(X,Y, test_size=0.2, random_state=0)

次に、80:20 train test split rule を用いて、データセットをトレーニング用とテスト用に分割します(80%のデータをトレーニング用に、残りの20%をテスト用に使用します)。

1
2
3
4
from sklearn.preprocessing import MinMaxScaler
scaler =  MinMaxScaler()
X_train=scaler.fit_transform(X_train)
X_test=scaler.fit_transform(X_test)

また、前処理としてトレーニングデータセットの正規化を行いますが、これは以下のコードで実現できます。

1
2
3
4
5
6
7
8
9
def baseline_model():
    model = Sequential()
    model.add(Dense(16, input_dim=7, activation='relu'))
    model.add(Dense(16, input_dim=7, activation='relu'))
    model.add(Dense(16, input_dim=7, activation='relu'))
    model.add(Dense(16, input_dim=7, activation='relu'))
    model.add(Dense(1))   
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model

ステップ3:モデルの構築

以下に示すコードは、モデルの宣言とモデルへのレイヤーの追加を含む、モデル全体を記述するメイン関数です。

この関数はまた、モデルのコンパイルと損失の計算を含む。

1
2
estimator = KerasRegressor(build_fn=baseline_model, epochs=50, batch_size=3, verbose=1)
estimator.fit(X_train,y_train)

ステップ4:モデルの学習

次のステップでは、モデルオブジェクトを作成し、以下のコードにあるように、トレーニングデータセットで同じものを学習させます。

エポック数はお好みでどうぞ。

Epoch 1/50
107/107 [==============================] - 1s 3ms/step - loss: 0.1087
Epoch 2/50
107/107 [==============================] - 0s 4ms/step - loss: 0.0065
Epoch 3/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0057
Epoch 4/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0052
Epoch 5/50
107/107 [==============================] - 0s 4ms/step - loss: 0.0049
Epoch 6/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0050
Epoch 7/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0047
Epoch 8/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0049
Epoch 9/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0044
Epoch 10/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0043
Epoch 11/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0044
Epoch 12/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0044
Epoch 13/50
107/107 [==============================] - 0s 4ms/step - loss: 0.0043
Epoch 14/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0041
Epoch 15/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0043
Epoch 16/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0042
Epoch 17/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0040
Epoch 18/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0043
Epoch 19/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0039
Epoch 20/50
107/107 [==============================] - 0s 4ms/step - loss: 0.0040
Epoch 21/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0039
Epoch 22/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0042
Epoch 23/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0040
Epoch 24/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0038
Epoch 25/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0042
Epoch 26/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0038
Epoch 27/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0040
Epoch 28/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0042
Epoch 29/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0039
Epoch 30/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0037
Epoch 31/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0038
Epoch 32/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0043
Epoch 33/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0040
Epoch 34/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0037
Epoch 35/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0039
Epoch 36/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0037
Epoch 37/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0038
Epoch 38/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0036
Epoch 39/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0036
Epoch 40/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0036
Epoch 41/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0037
Epoch 42/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0037
Epoch 43/50
107/107 [==============================] - 0s 4ms/step - loss: 0.0036
Epoch 44/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0037
Epoch 45/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0037
Epoch 46/50
107/107 [==============================] - 0s 4ms/step - loss: 0.0038
Epoch 47/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0036
Epoch 48/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0037
Epoch 49/50
107/107 [==============================] - 0s 4ms/step - loss: 0.0037
Epoch 50/50
107/107 [==============================] - 0s 3ms/step - loss: 0.0034
<keras.callbacks.History at 0x7f10c0173e10>
[19]
0s

学習の出力は以下のようになります。

1
2
3
4
5
6
prediction = estimator.predict(X_test)
print("ORIGINAL DATA")
print(y_test)
print()
print("PREDICTED DATA")
print(prediction)

ステップ5:モデルのテスト

では、テスト用データセットの値を予測し、元の値と一致させることを試してみましょう。

ORIGINAL DATA
[0.71 0.7  0.79 0.73 0.72 0.48 0.77 0.71 0.9  0.94 0.58 0.89 0.72 0.57
 0.78 0.42 0.64 0.84 0.63 0.72 0.9  0.83 0.57 0.47 0.85 0.67 0.44 0.54
 0.92 0.62 0.68 0.73 0.73 0.61 0.55 0.74 0.64 0.89 0.73 0.95 0.71 0.72
 0.75 0.76 0.86 0.7  0.39 0.79 0.61 0.64 0.71 0.8  0.61 0.89 0.68 0.79
 0.78 0.52 0.76 0.88 0.74 0.49 0.65 0.59 0.87 0.89 0.81 0.9  0.8  0.76
 0.68 0.87 0.68 0.64 0.91 0.61 0.69 0.62 0.93 0.43]
 
PREDICTED DATA
[0.64663166 0.6811929  0.77187485 0.59903866 0.70518774 0.5707331
 0.6844891  0.6232987  0.8559068  0.9225058  0.50917023 0.9055291
 0.6913604  0.40199894 0.8595592  0.6155516  0.5891675  0.793468
 0.5415057  0.7054745  0.8786436  0.8063141  0.55548865 0.3587063
 0.77944946 0.5391258  0.43374807 0.62050253 0.90883577 0.6109837
 0.64160395 0.7341113  0.73316455 0.5032365  0.7664028  0.76009744
 0.59858805 0.86267006 0.60282356 0.94984144 0.7196544  0.63529354
 0.7032968  0.8164513  0.8044792  0.6359613  0.54865533 0.6914524
 0.589018   0.55952907 0.6446153  0.77345765 0.6449453  0.8998446
 0.68746895 0.74362046 0.71107167 0.73258513 0.7594558  0.8374823
 0.7504637  0.4027493  0.61975926 0.46762955 0.8579673  0.814696
 0.7111042  0.8707262  0.7539967  0.7515583  0.5506843  0.8436626
 0.8139006  0.5593421  0.933276   0.61958474 0.6084135  0.63294107
 0.9234169  0.44476634]

出力はこのようになる。

1
2
3
4
5
6
from sklearn.metrics import accuracy_score
 
train_error =  np.abs(y_test - prediction)
mean_error = np.mean(train_error)
 
print("Mean Error: ",mean_error)

値がある程度一致していることがわかる。

しかし、念のため、平均誤差も計算してみましょう。

ステップ6:平均誤差の計算

First5rows Of University Adm Pred Dataset

平均誤差は0.0577927375137806であり、これは我々の結果がかなり正確であることを示すのに十分な値です。

まとめ

あなたは、大学入試問題集を自作する方法を学びました。

このチュートリアルは気に入りましたか?いずれにせよ、以下のチュートリアルをご覧になることをお勧めします。

  1. Pythonを使った暗号通貨の価格予測
  2. Pythonによる興行収入予測 – 簡単な実装方法
  3. Pythonによる株価予測
  4. Pythonを使ったワインの分類 ~簡単な説明

お時間を割いていただき、ありがとうございました! 何か新しいことを学べたでしょうか!

タイトルとURLをコピーしました