Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【Python】Scikitlearnの内LinearRegressionを使った値予測を行う

こんばんは、葛の葉です。機械学習ライブラリであるsklearnを使ってデータの学習と予測…と言いたいところなんだけど、なんだかいいデータがなくて、全く無造作なデータを学習させて予測するという意味のないことやってました。

環境

Anaconda 5.3.0

Python 3.7.0

numpy 1.15.1

pandas 0.23.4

jupyter 1.0.0

scikit-learn 0.19.2

適当なデータを使う。

tekito.csv

data1,data2,data3
22,62,73
22,66,61
76,58,26
35,60,43
35,30,100
61,35,97
50,62,48
87,94,86
95,33,34
35,58,32
79,84,20
82,15,92
50,66,37
62,89,74
53,51,65
74,80,75
89,27,80
100,62,78
97,77,79
88,37,54

data1,data2,data3は共に15から100の数値を適当出力する設定にしているだけなので、なんも意味を持ちません。

重回帰分析を使う

回帰分析のうち、目的変数に対して説明変数が2つ以上のものを重回帰分析といい、説明変数が1つの場合は単回帰分析と言うみたいです。

目的変数とは予測したいデータで今回はdata3です。

説明変数とは目的変数を予測するために使うデータのことdata1,data2です。

data1data2を使ってdata3を予測するというのが今回の目的です。

回帰分析については以下のWikipediaも参照。

回帰分析 - Wikipedia

説明変数のデータ

test.csv

data1,data2
35,77
60,43
45,53
64,65
81,21
90,33
100,46
50,18
30,32
29,60

このtest.csvdata1,data2を使ってdata3に相当するデータを出力する。

JupyterNoteBookを使う

以下はJupyterNoteBook上でのコマンドになります。

ライブラリのインポート

import pandas as pd
import numpy as np # 要らないかも
from sklearn.linear_model import LinearRegression as LR

上記コードをセルに挿入してからShift + Enterすると次のセルに移ります。

その時に何らかのエラーが出ればそれはライブラリのインポートが失敗していると思います。

from sklearn.linear_model import LinearRegression as LR

これが機械学習のライブラリsklearnです。

LinearRegressionは線形回帰を意味しているようです。

as LRとしてLinearRegressionLRとして略称します。

CSVのインポート

pandasでcsvをロードします。

train = pd.read_csv('tekito.csv')
test = pd.read_csv('test.csv')

pandas.read_csv('***.csv')はpandasのライブラリとしてcsvをpandasのDataFrameとして読み込みます。

Shift + Enterで、次のセルへ。

エラーを吐く場合は事前に説明していたCSVが、同じディレクトリ内にないとか、その辺りだとおもいます。

train.head()

.head()は読み込んだDataFrameの最初の5行分を出力します。

data1    data2   data3
0   22  62  73
1   22  66  61
2   76  58  26
3   35  60  43
4   35  30  100

Shift + Enterで、次のセルへ。

特定のカラムのデータを読み取る

trainX = train[['data1', 'data2']]
y = train['data3']
testX = test[['data1','data2']]

train内の2つのカラムを代入しています。

train[['data1', 'data2']]

yは目的変数としtrain['data3']を代入しています。

testXは最終的に予測するための説明変数をもっています。

trainXyを使ってdata1,data2data3で線形回帰を行い、最終的にはtestX内にあるdata1,data2を元にtestXのdata3に当たるデータを出力します。

Shift + Enterで、次のセルへ。

モデルの作成とモデルへの学習

model = LR()
model.fit(trainX, y)

model.fit(trainX, y).fit(説明変数, 目的変数)となっており、回帰モデルとなっています。

trainXdata1data2をもっているので重回帰モデルとなっています。

Shift + Enterで、次のセルへ。

学習したデータを出力する

pred = model.predict(testX)
pred

以下のデータが学習で出したデータになります。

array([55.80356749, 65.91988259, 62.42089327, 60.75553676, 72.7960059 ,70.4459384 , 67.91714972, 71.41497867, 66.58486472, 59.5950097 ])

さっぱり意味がないデータですけどね。

Shift + Enterで、次のセルへ。

ついでにCSVとして出力しましょう。

tester = pd.DataFrame()
tester[0] = pred
tester.to_csv('cho_tekitou.csv', header=None, index=None)

.to_csv関数にてcho_tekitou.csvという名前で出力します。

ここまできていて言うのもなんだが

data1data2は無造作なデータで、当然、法則性なんてないです。なので、最終的なpredの値はとても意味のないものになるはずです。

またpredが正確にデータを予言できているかどうか、というのも保証できません。

とりあえず、データを出せてよかったねってレベルで今回は終わりです。

f:id:Kuzunoha-NE:20190104222556p:plain