としおの読書生活

田舎に住む大学院生であるとしおの読書記録を綴ります。主に小説や新書の内容紹介と感想を書きます。 読書の他にも旅行やパソコン関係などの趣味を詰め込んだブログにしたいです。

カテゴリ: Python3

データサイエンスの勉強をしてみようと思い、今更ながらですがKaggleのタイタニック号の生存者予測に挑戦してみました。

Kaggleを進める工程を大まかに分けると以下の3つの工程に分けることができます。

  • EDA(探索的データ解析)
  • 特徴量エンジニアリング
  • パラメータチューニング

本記事ではカーネルを参考にしながら、基本となるEDAで分析した内容についてまとめていきます。





タイタニックのデータの基本情報を確認する(EDA)


まずは、使用するライブラリをインポートします。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
sns.set()

次に、データをロードします。

# load dataset
train_df = pd.read_csv("./train.csv")

データのロードができましたらとりあえずテーブルを確認してみます。

とりあえず10行分ほど表示

train_df.head(10)

1


次にデータの基本統計量を確認します。

train_df.describe()

2

AgeのCountが他が891になっているのに対して714となっているのが気になります。おそらくデータが欠損しているのかな…。

なのでその他に欠損値がないのかを以下の関数で確認します。

# 欠損数確認
def missing_table(df): 
        null_val = df.isnull().sum()
        percent = 100 * df.isnull().sum()/len(df)
        kesson_table = pd.concat([null_val, percent], axis=1)
        kesson_table_ren_columns = kesson_table.rename(
        columns = {0 : '欠損数', 1 : '%'})
        return kesson_table_ren_columns
missing_table(train_df)

3

Ageの他にCabinとEmbarkedが欠損しています。Cabinに関しては欠損数が多すぎるので特徴量として使うには微妙なのかもしれません…。






グラフを使用してデータの特徴を分析する


データの基本的な様子は分かったのですが、上記の情報だけでは説明変数を選択することはまだ難しいです。

そこで、『Seaborn』というライブラリを使用してデータを可視化していきます。


とりあえず、どれぐらいの人物が生存しているのかを棒グラフで確認します。
sns.countplot(train_df['Survived'])

4


次に性別ごとの生存者の割合を確認します。
sns.countplot(x='Survived', hue='Sex', data=train_df)

5

男性よりも女性のほうが生存率が高いみたいですね。



ではチケットの等級ごとの割合はどうなんでしょうか。
sns.countplot(x='Survived', hue='Pclass', data=train_df)

6

等級が高いほど生存率が高いことが分かります。



では、船に登場した港が生存率に関係あるのかも確認していきます。
sns.countplot(x='Survived', hue='Embarked', data=train_df)

9

データ名を見る限りでは影響しなさそうな気がしていたのですが、C港から搭乗している人のほうがS港、Q港から搭乗している人よりも生存率が高いみたいですね。




次に同乗している兄弟と配偶者の数と親と子どもの数が生存率に影響するのかを見ていきます。
g = sns.FacetGrid(train_df, hue="Survived", height=5)
g.map(sns.distplot, "SibSp", kde=False) 
g.add_legend()

7
g = sns.FacetGrid(train_df, hue="Survived", height=5)
g.map(sns.distplot, "Parch", kde=False) 
g.add_legend()

8

それぞれのグラフを見てみると同乗者がいない人に比べて、同乗者がいる人のほうが生存率が高くなることが分かります。

ただ、同乗者が4人以上の場合はどちらのグラフを見ていても生存率が低くなっていますね。



次に年齢別の生存率はどのぐらいなのかを確認していきます。

まず、船に乗っている人たちの年齢がどれぐらいの人が多いのかをヒストグラムで確認してみます。
train_df['Age'].hist(bins=40);

10

20、30代の人が大半以上のようです。

では年齢別の生存率を見てみましょう。
g = sns.FacetGrid(train_df, hue="Survived", height=5)
g.map(sns.distplot, "Age", kde=False) 
g.add_legend()

11

5歳未満、10~15歳と75~80歳の人たちは生存する確率が高いみたいです。

それ以外の年代は生存する確率が低いみたいですね。特に65~75歳の人たちは生存率が0%みたいです。


また、性別ごとの年齢別の生存率の割合もみてみましょう。
g = sns.FacetGrid(train_df, col='Sex', hue="Survived", height=5)
g.map(sns.distplot, "Age", kde=False) 
g.add_legend()

12

女性はほぼ全ての年齢で生存する確率のほうが高いみたいです。

一方男性は15~45歳の生存率がかなり低いです。救助などを行っていた結果避難船に乗り遅れたのかな…。




次に運賃別の生存率を見てみましょう。
bins = np.arange(0, 550, 50)
g = sns.FacetGrid(train_df, hue="Survived", height=5)
g.map(sns.distplot, "Fare", kde=False, bins=bins) 
g.add_legend()

13

運賃が50$未満の人たちは生存率が低いですが、それ以外は生存率が高いみたいです。



とりあえず一通りデータを分析してみましたが、以下のことが分かりました。
  • Sex : 男性より女性のほうが生存率が高い
  • Pclass : クラスが高いほど生存率が高い
  • Parch、SibSp : 同乗者がいない人は生存率が低い。同乗者が1~3人の人は生存率が高い。同乗者が4人以上になると生存率が低くなる。
  • Embarked : S港とQ港に比べてC港から搭乗した人は生存率が高い
  • Age : 5歳未満の人は性別関係なく生存率が高い。15~45の男性は生存率が低い。女性はほぼ全ての年代で生存する確率のほうが高い。
  • Fare : 運賃が50ドル未満の人は生存率が低い



最後に


上記の分析ができたところでEDAは終わろうと思います。

次の記事ではEDAで分かったことから特徴量エンジニアリングをしていきたいと思います。

まだまだ勉強不足ですのでご指摘等がありましたらコメントをいただけると助かります。







DeepLearningのブームのきっかけとなったAlexNetを使用してcifar10の画像分類をしてみたので忘備録として記録を残します。

cifar10について知りたい人は以下の記事で使用方法などを書いているのでそちらをご覧ください。







AlexNetとは


AlexNetは2012年のILSVRCにおいて従来の画像分類手法に対して大差をつけて優勝した手法である。

AlexNetにより画像分類における深層学習の有効性が示され、深層学習のブームがおきた。

現在でも画像分類モデルのベースラインとして利用されることが多々ある。

1


AlexNetのモデルの構造は上手のようになっている、5層の畳み込み層、3層のプーリング層、3層の全結合層からできている。


AlexNetでは活性化関数が従来使用されてきたtanhではなくReLUが使用されている。ReLUを使用することでtanhに比べて学習を高速化することができている。

また、過学習を抑制するために隠れ層のニューロンを無効化するDropoutもAlexNetでは使用されている。



実装




# AlexNetの論文を参考して作成したモデル def CreateAlexNet(input_shape, num_classes): model=Sequential() model.add(Conv2D(filters=96, kernel_size=3, strides=(1, 1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='zeros')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(BatchNormalization()) model.add(Conv2D(filters=256, kernel_size=3, strides=(1,1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='ones')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(BatchNormalization()) model.add(Conv2D(filters=384, kernel_size=3, strides=(1,1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='zeros')) model.add(Conv2D(filters=384, kernel_size=3, strides=(1,1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='ones')) model.add(Conv2D(filters=256, kernel_size=3, strides=(1,1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='ones')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(BatchNormalization()) model.add(Flatten()) model.add(Dense(4096, activation='relu', bias_initializer='ones')) model.add(Dropout(0.5)) model.add(Dense(4096, activation='relu', bias_initializer='ones')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) return model

モデルは先ほどのAlexNetの図を参考に作成しました。

畳み込み層 ー>プーリング層 ー>畳み込み層 ー>プーリング層 ー>畳み込み層 ー>畳み込み層 ー>畳み込み層 ー>プーリング層 ー>全結合層 ー>全結合層という構成になっています。






学習結果


100epoch学習させてみた結果以下のような結果になりました。

2

テストデータに対する精度は80%ほどまで向上しました。パラメータのチューニングをせずにここまでの精度が出るなんてさすがという感じです。

前回行ったLeNetでは精度が65%ほどでしたので、それと比べてもAlexNetの性能の良さが分かります。

最後に、今回作成したソースコードを以下にのせておきます。


from keras.models import Sequential from keras.layers.convolutional import Conv2D from keras.layers.pooling import MaxPool2D from keras.layers.core import Dense, Flatten, Dropout from keras.layers.normalization import BatchNormalization from keras.datasets import cifar10 from keras.utils import np_utils from keras import optimizers import matplotlib.pyplot as plt # AlexNetの論文を参考して作成したモデル def CreateAlexNet(input_shape, num_classes): model=Sequential() model.add(Conv2D(filters=96, kernel_size=3, strides=(1, 1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='zeros')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(BatchNormalization()) model.add(Conv2D(filters=256, kernel_size=3, strides=(1,1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='ones')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(BatchNormalization()) model.add(Conv2D(filters=384, kernel_size=3, strides=(1,1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='zeros')) model.add(Conv2D(filters=384, kernel_size=3, strides=(1,1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='ones')) model.add(Conv2D(filters=256, kernel_size=3, strides=(1,1), padding='same', input_shape=input_shape, activation='relu', bias_initializer='ones')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(BatchNormalization()) model.add(Flatten()) model.add(Dense(4096, activation='relu', bias_initializer='ones')) model.add(Dropout(0.5)) model.add(Dense(4096, activation='relu', bias_initializer='ones')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) return model # 学習の様子を可視化 def ShowTrainData(history): plt.figure(figsize=(10,5)) plt.subplot(1,2,1) plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.title('Model accuracy') plt.ylabel('Accuracy') plt.xlabel('Epoch') plt.legend(['Train', 'Test'], loc='upper left') plt.subplot(1,2,2) plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('Model loss') plt.ylabel('Loss') plt.xlabel('Epoch') plt.legend(['Train', 'Test'], loc='upper left') plt.show() def main(): # cifer10をダウンロード (x_train,y_train),(x_test,y_test)=cifar10.load_data() # 32×32×3の配列 # 画像を0から1の範囲で正規化 x_train = x_train.astype('float32') # float32に変換 x_train = x_train/255; # 0~1の値に変換するために255で割る(cifer10は0-255のRGBで表現されている) x_test = x_test.astype('float32') x_test = x_test/255; # 正解ラベルをone-hot表現に変換 y_train = np_utils.to_categorical(y_train, 10) y_test = np_utils.to_categorical(y_test, 10) #モデルを構築 model = CreateAlexNet(x_train[0].shape, 10) sgd = optimizers.SGD(lr=0.01) model.compile(optimizer='SGD',loss='categorical_crossentropy',metrics=['accuracy']) batch_size = 128; epoch = 100; history=model.fit(x_train,y_train,batch_size=batch_size,nb_epoch=epoch,verbose=1,validation_split=0.1) ShowTrainData(history) if __name__ == '__main__': main()




CNNの元祖となるLeNetを用いてcifar10の画像分類を行いました。





cifar10とは


cifar10とは飛行機、自動車、鳥、猫、トナカイ、犬、蛙、馬、船、トラックの10種の画像のデータセットです。

各画像は32×32のカラー画像で全体画像数は60000件あります。そのうち50000件が訓練データ、10000件がテストデータとなっています。

cifar10の画像の例を以下に示します。

Figure_1


LeNetとは


LeNetとは1998年に発表された畳み込みニューラルネットワーク(CNN)の元祖とも呼ばれているニューラルネットワークです。

ディープラーニングの火つけ役となったAlexNetもLeNetを参考にしたネットワーク構成となっています。

Figure_2

LeNetのネットワーク構成は、2層の畳み込み層、2層のプーリング層、2層の全結合層からできており、近年のモデルと比べると層が浅いのが特徴的です。

また、近年よく用いられているDropoutやBatch Normalaizationなども用いられていないためシンプルな構成となっています。


実装



cifar10の準備


# cifer10をダウンロード
    (x_train,y_train),(x_test,y_test)=cifar10.load_data() # 32×32×3の配列

    # 画像を0から1の範囲で正規化
    x_train = x_train.astype('float32') # float32に変換
    x_train = x_train/255; # 0~1の値に変換するために255で割る(cifer10は0-255のRGBで表現されている)
    x_test = x_test.astype('float32')
    x_test = x_test/255;

    # 正解ラベルをone-hot表現に変換
    y_train = np_utils.to_categorical(y_train, 10)
    y_test = np_utils.to_categorical(y_test, 10)

cifar10の画像は0-255のRGBで表現されているため255で割って0~1の範囲で正規化しています。

正解ラベルはone-hot表現に変換しています。
4なら[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
6なら[0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
といった感じに。


LeNetの構築


# LeNetの論文を参考して作成したモデル
def CreateLeNet(input_shape, num_classes):
    model=Sequential()
    
    model.add(Conv2D(filters=6, kernel_size=5, padding='same', input_shape=input_shape, activation='tanh'))
    model.add(MaxPool2D(pool_size=(2,2)))
    model.add(Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'))
    model.add(MaxPool2D(pool_size=(2,2)))
    model.add(Flatten())
    model.add(Dense(120, activation='tanh'))
    model.add(Dense(84, activation='tanh'))
    model.add(Dense(num_classes, activation='softmax'))
    
    return model

モデルは先ほどのLeNetの図を参考に作成しました。

畳み込み層 ー>プーリング層 ー>畳み込み層 ー>プーリング層 ー>全結合層 ー>全結合層という構成になっています。

LeNetのオリジナルの論文をモデルに作ったので活性化関数がreluではなくtanhなのに違和感を感じます…。


学習結果


100epoch学習させてみた結果以下のような結果になりました。

Figure_3

テストデータに対する精度は65%ほどまで向上し自分が予想していたよりも良い結果になりました。

128 -> 256 ー> 128といった全結合層のみを使用して学習した結果は以下のようになっていたことからLeNetの画像分類に対する有用性が分かりますね。

Figure_4


ただ、30epochを超えたあたりから過学習を起こしているのが少し気になります。Dropoutの処理とかをいれたらましになるのかな。


次はLeNetベースで精度を改善するか、他のモデルを使ってcifar10の学習をしてみたいと思います。

AlexNetを使用してcifar10の画像分類を行ってみました。




最後に、今回使用したソースコードを以下にのせておきます。

from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPool2D
from keras.layers.core import Dense, Flatten
from keras.datasets import cifar10
from keras.utils import np_utils
import matplotlib.pyplot as plt


# LeNetの論文を参考して作成したモデル
def CreateLeNet(input_shape, num_classes):
    model=Sequential()
    
    model.add(Conv2D(filters=6, kernel_size=5, padding='same', input_shape=input_shape, activation='tanh'))
    model.add(MaxPool2D(pool_size=(2,2)))
    model.add(Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'))
    model.add(MaxPool2D(pool_size=(2,2)))
    model.add(Flatten())
    model.add(Dense(120, activation='tanh'))
    model.add(Dense(84, activation='tanh'))
    model.add(Dense(num_classes, activation='softmax'))
    
    return model


# 学習の様子を可視化
def ShowTrainData(history):
    
    plt.figure(figsize=(10,5))
    
    plt.subplot(1,2,1)
    plt.plot(history.history['accuracy'])
    plt.plot(history.history['val_accuracy'])
    plt.title('Model accuracy')
    plt.ylabel('Accuracy')
    plt.xlabel('Epoch')
    plt.legend(['Train', 'Test'], loc='upper left')

    plt.subplot(1,2,2)
    plt.plot(history.history['loss'])
    plt.plot(history.history['val_loss'])
    plt.title('Model loss')
    plt.ylabel('Loss')
    plt.xlabel('Epoch')
    plt.legend(['Train', 'Test'], loc='upper left')
    
    plt.show()


def main():
    # cifer10をダウンロード
    (x_train,y_train),(x_test,y_test)=cifar10.load_data() # 32×32×3の配列

    # 画像を0から1の範囲で正規化
    x_train = x_train.astype('float32') # float32に変換
    x_train = x_train/255; # 0~1の値に変換するために255で割る(cifer10は0-255のRGBで表現されている)
    x_test = x_test.astype('float32')
    x_test = x_test/255;

    # 正解ラベルをone-hot表現に変換
    y_train = np_utils.to_categorical(y_train, 10)
    y_test = np_utils.to_categorical(y_test, 10)

    #モデルを構築
    model = CreateLeNet(x_train[0].shape, 10)
    model.compile(optimizer='SGD',loss='categorical_crossentropy',metrics=['accuracy'])
    batch_size = 128;
    epoch = 100;

    history=model.fit(x_train,y_train,batch_size=batch_size,nb_epoch=epoch,verbose=1,validation_split=0.1)
    ShowTrainData(history)
    
if __name__ == '__main__':
    main()




DeepLearningの勉強をしていたときに学習中の精度や損失関数を可視化したいと思い、matplotlibを使用してグラフを表示する方法を調べたのでまとめます。




開発環境


開発環境は以下の通りです。
  • Python 3.69
  • Keras   2.3.1
  • matplotlib 3.2.1



精度と損失関数の値を可視化する


精度は以下のコードで可視化することができます。


plt.plot(history.history['accuracy']) # 訓練データに対しての精度をプロット plt.plot(history.history['val_accuracy']) # テストデータに対しての精度をプロット plt.title('Model accuracy') # グラフタイトル plt.ylabel('Accuracy') # グラフのY軸ラベル plt.xlabel('Epoch') # グラフのX軸ラベル plt.legend(['Train', 'Test'], loc='upper left') # 凡例の表示
plt.show() # グラフを表示する


精度を可視化すると以下のようなグラフができあがります。

Figure_1



損失関数の値を可視化する


損失関数の値は以下のコードで可視化することができます。(ほとんど精度の可視化と同じ)


plt.plot(history.history['loss']) # 訓練データの値 plt.plot(history.history['val_loss']) # テストデータの値 plt.title('Model loss') # グラフのタイトル plt.ylabel('Loss') # グラフのY軸ラベル plt.xlabel('Epoch') # グラフのX軸ラベル plt.legend(['Train', 'Test'], loc='upper left') # 凡例の表示

plt.show() # グラフを表示する


損失関数の値を可視化すると以下のようなグラフができあがります。

Figure_2



2つのグラフを横並びで表示する

matplotlibのsubplot関数を使うと2つのグラフを横並びで表示することができます。

subplotの引数は「行の数,列の数,何番目に配置しているか」となっているので、引数次第では縦に2つなども表示が可能です。

以下にサンプルコードを示します。


plt.figure(figsize=(10,5)) # グラフのサイズ # Plot training & validation accuracy values plt.subplot(1,2,1) # 1つめのグラフ plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.title('Model accuracy') plt.ylabel('Accuracy') plt.xlabel('Epoch') plt.legend(['Train', 'Test'], loc='upper left') # Plot training & validation loss values plt.subplot(1,2,2) # 2つめのグラフ plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('Model loss') plt.ylabel('Loss') plt.xlabel('Epoch') plt.legend(['Train', 'Test'], loc='upper left') plt.show() # グラフを表示する



MNISTを全結合のみ使って学習させたグラフは以下のようになっていました。

Affine

過学習を起こしているからか損失関数の値がとんでもないことになってる…。



今回の記事では前回の記事で収集したロト6の当選番号を用いて、機械学習を使って当選番号を予測してみました。

どの機械学習の手法を使うか悩んだのですが、今回は過去の当選番号を時系列データとして扱い次の当選番号を予測しようと思ったためSVRを使うことにしました。RNNを使うのもありだとは思ったのですが、学習に時間がかかりそうだったのでとりあえず手軽に実装できるSVRで試してみます。



ライブラリのインストール


今回、SVRを実装するにあたり scikit-learn を使用しました。scikit-learnは以下のコマンドでインストールすることができます。
pip install scikit-learn
また、こちらはインストールしなくてもいいのですがデータをグラフ化して分析するのにはMatplotlibを使用しました。Matplotlibは次のコマンドでインストールすることができます。
pip install matplotlib


Matplotlibを使って過去の当選番号をグラフ化してみる


とりあえず過去の当選番号の第1回目から第100回目までの結果を本数字1~6にわけてグラフ化してみます。
import pandas as pd
import matplotlib.pyplot as plt

train = pd.read_csv("loto6.csv") # 前回の記事で保存したデータの読み込み

# 第1回目から第100回目までの本数字をリスト化
x = train["round"].values[:100] main1 = train["main1"].values[:100] main2 = train["main2"].values[:100] main3 = train["main3"].values[:100] main4 = train["main4"].values[:100] main5 = train["main5"].values[:100] main6 = train["main6"].values[:100]

%matplotlib inline # jupyter notebookで描画 plt.plot(x, y1, color="red", label="main1") plt.plot(x, y2, color="darkorange", label="main2") plt.plot(x, y3, color="yellow", label="main3") plt.plot(x, y4, color="greenyellow", label="main4") plt.plot(x, y5, color="cyan", label="main5") plt.plot(x, y6, color="blue", label="main6") plt.legend(bbox_to_anchor=(1.05, 1)) plt.show()
loto2_1

グラフを見ている限り、ロト6の当選番号に規則性がなくて機械学習で予測するのは無理そうですが、ロマンを追い求めるために予測しようとしているので気にしない方向で行きます。




SVRを使って予測してみる


サポートベクター回帰(SVR)とはサポートベクターマシン(SVM)を回帰分析に応用した手法です。SVRについて詳しく知りたい方は下記のページが参考になると思います。

https://datachemeng.com/supportvectorregression/

今回は第n回目の当選番号を予測するのに、第1回目から第n-1回目までの当選番号を訓練データとしてSVRで予測します。また本番号は6つありますが、各番号が独立したデータと考えます。

上記の方法で1261回目~1340回目までの結果を予測してみたところ5等が3回だけ当たりました。16000円分宝くじを購入して、3000円しか返ってこないのは悲惨です。わざわざ機械学習をつかっているのに乱数で番号を選択した場合とあまり変わらない気がします…。

訓練データの数を変更したりしてみたのですが結果はあまり変わらずSVRでロト6の予測するのは難しそうです。各本番号を独立したデータとして考えたのも失敗した要因なのかもしれません。ハイパーパラメータをもっと細かく調整すればもう少しマシになる可能性もありますが、正直そこまで変わらない気がします…。

一応SVRでロト6の当選番号を予測するコードを載せておきます。コードが無駄に長くて申し訳ありません。
# -*- coding: utf-8 -*-
# loto6の番号をSVRを使って予想

import pandas as pd
import numpy as np
from sklearn import svm

# 訓練データとテストデータの読み込み
train = pd.read_csv("loto6.csv") # 第1~1260回目
test = pd.read_csv("loto6_test.csv") # 第1261~1340回目

train_x = train["round"].values
train_X = train_x[:, np.newaxis] # SVRで学習できるように変換
train_y1 = train["main1"].values
train_y2 = train["main2"].values
train_y3 = train["main3"].values
train_y4 = train["main4"].values
train_y5 = train["main5"].values
train_y6 = train["main6"].values
test_y1 = test["main1"].values
test_y2 = test["main2"].values
test_y3 = test["main3"].values
test_y4 = test["main4"].values
test_y5 = test["main5"].values
test_y6 = test["main6"].values
pre_list = np.array([np.zeros(7)]) # 予測結果を格納

# 学習の設定
my_svr = svm.SVR(kernel="rbf", C=1e1, gamma=0.1, epsilon=0.1)

# 1261回~1340回まで学習と予測を繰り返す
for i in range(1, len(test_y1)+1):
  print(i+1260)
  pre_num = np.array([])
  
  # 学習して結果を予測
  #第1回目~1260+i-1回目までの結果を使って1260+i回目の結果を予測
  my_pre_1 = my_svr.fit(train_X, train_y1).predict(np.array([[1260+i]]))
  my_pre_2 = my_svr.fit(train_X, train_y2).predict(np.array([[1260+i]]))
  my_pre_3 = my_svr.fit(train_X, train_y3).predict(np.array([[1260+i]]))
  my_pre_4 = my_svr.fit(train_X, train_y4).predict(np.array([[1260+i]]))
  my_pre_5 = my_svr.fit(train_X, train_y5).predict(np.array([[1260+i]]))
  my_pre_6 = my_svr.fit(train_X, train_y6).predict(np.array([[1260+i]]))
  
  pre_num = np.append(pre_num, np.round(my_pre_1))
  pre_num = np.append(pre_num, np.round(my_pre_2))
  pre_num = np.append(pre_num, np.round(my_pre_3))
  pre_num = np.append(pre_num, np.round(my_pre_4))
  pre_num = np.append(pre_num, np.round(my_pre_5))
  pre_num = np.append(pre_num, np.round(my_pre_6))
  pre_list = np.insert(pre_list, len(pre_list), pre_num, axis=0) # 四捨五入した結果を予測結果とする
  
  # train_X, train_y1に1260+i回目の結果を追加
  train_X = np.insert(train_X, len(train_X), 1260+i, axis=0)
  train_y1 = np.append(train_y1, test_y1[i-1])
  train_y2 = np.append(train_y2, test_y2[i-1])
  train_y3 = np.append(train_y3, test_y3[i-1])
  train_y4 = np.append(train_y4, test_y4[i-1])
  train_y5 = np.append(train_y5, test_y5[i-1])
  train_y6 = np.append(train_y6, test_y6[i-1])

# 予測結果を出力
pre_list = np.delete(pre_list, 0, 0) # 1行目を削除
df = pd.DataFrame(pre_list, columns = ["main1", "main2", "main3", "main4", "main5", "main6", "bonus", ])
df.index = df.index + 1
df.to_csv('loto6_pre.csv')




最後に


SVRでの予測は失敗に終わりました。気が向いたらRNNを使って予測する記事を作るかもしれません。


↑このページのトップヘ