AI・機械学習

Scikit-learnで非線形回帰分析【Python 回帰分析③】

助手ミルク
助手ミルク
前回はPythonの線形回帰分析について勉強しましたね!!

虎ぱぱ
虎ぱぱ
そうですね。今回はより正確な分析を行うため、非線形回帰分析について勉強していきます!!

助手ミルク
助手ミルク
そうですね。ちゃんと分析できたらCreepyNutsのCDが買えるわよ!?

虎ぱぱ
虎ぱぱ
…虎の威を借る狐め…

 

 

前回、Scikit-learnを使った線形回帰分析について書きました。

scikit-learnで線形回帰分析 【Python 回帰分析②】PythonプログラミングのNumpyで線形回帰分析した結果の精度を確認するために、決定係数を導き出したい。Scikit-learnを使うことで、簡単に実装ができたので、記事にしました。機械学習エンジニアを目指す方は読んでみて下さい。...

 

 

CreepyNutsさんのレアなCDが欲しくて嫁に交渉するために、落札価格の推移を予測しました。

 

実線形回帰分析を実施した結果がこちらです!!

 

 

回帰分析の結果から、30日経過後の価格は2273円という結果を導きだすことができました!しかしながら…決定係数が0.0608…

 

助手ミルク
助手ミルク
決定係数は0~1の間で推移して、1に近ければ近いほど予測が正確という意味でしたね!!こんな予測ではCDは買えません!!

 

今回は更に詳細な分析を行うために、『Numpy』と『scikit-learn』を使って、分析にトライします!!

 

読んで得する人は??回帰分析,特に決定係数の算出が気になるなら必見

 

 

今回はPythonのNumpyscikit-learnを使って非線形単回帰分析を実践します!!

 

 

 

前回も書きましたが,回帰分析は機械学習エンジニアやデータサイエンティスト必ずと言っていほどぶちあたる壁なので、読んで損はないはずです。☟☟☟

 

 

 

 

  • Pythonで非線形回帰分析がしたい人,決定係数の算出方法が知りたい人



  • 機械学習、AI系のエンジニア・データサイエンティストを志す方



  • Pythonの”scikit-learn”これ『サイキットラーン』と読みます.ギリ知ってた方 

 

 

助手ミルク
助手ミルク
線形回帰分析より非線形回帰分析の方が”正確”なんですか??

虎ぱぱ
虎ぱぱ
“正確”といよりは”柔軟性が高い”という認識です!!用途によって使い分けると良いです!

助手ミルク
助手ミルク
なるほど(*’ω’*)決定係数もより“1”に近づく訳ですね。 😆

 

 

NumpyとScikit-learnを使った線形回帰分析【前回の復習】

 

助手ミルク
助手ミルク
前回はNumpyとPythonを使って線形回帰分析を行いましたね!!

虎ぱぱ
虎ぱぱ
そうですね!!いい線行っていると思ったけど,決定係数が…

 

 

前回の復習です。NumpyとScikitLearnを使って単回帰分析をやってみました。ここでは線形回帰と非線形回帰の近似線を書いてます!!

 

コードはこちら☟☟☟

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
#変数 
fig = plt.figure() 
ax = fig.add_subplot(1,1,1) #y軸csvデータ読み込み 
data = pd.read_csv('cp.csv') 
y = np.array(data)#配列化 
y = y.reshape(-1,)#次元変更(2から1次元) 
#日付のx軸を作成 
x = pd.date_range('2019-08-30 00:00:00', periods=16, freq='d') 
x1=np.arange(16) x2 = [[x1] for x1 in x1] 
#線形単回帰 
from sklearn import linear_model 
clf = linear_model.LinearRegression() clf.fit(x2,y) 
# 予測モデルを作成 
print("回帰係数= ", clf.coef_) 
print("切片= ", clf.intercept_) 
print("決定係数= ", clf.score(x2,y)) 
#グラフ作成 
ax.plot(x2,y,'b') 
ax.plot(x2, clf.predict(x2),'k') 
#グラフフォーマットの指定 
plt.xlabel("Days elapsed")#横軸ラベル 
plt.ylabel("plice")#縦軸ラベル
 plt.grid(True)#目盛表示 
plt.tight_layout()#全てのプロットをボックス内に 
plt.show()
 

助手ミルク
助手ミルク
このコードを回すと,冒頭の結果みたいになる訳ね!!決定係数が足りないわ!!気合い入れなおしなさい!!

虎ぱぱ
虎ぱぱ
分析の内容教えてもらう時は素直な癖に結果の考察は厳しめなんだよな…君はきっと出世するよ。

 

scikit-learn 非線形単回帰分析 価格の推移を予測してみた

まずは近似曲線を生成 非線形回帰は次数が重要

 

それではCreepyNutsさんのCD価格を詳細に分析するため,非線形単回帰分析を行っていきます!

 

今回はNumpyで近似曲線を描きskit-learnで算出を行う形で分析します!!

 

 

助手ミルク
助手ミルク
敢えて両方を使ってみるということですね!!勉強になります(*’ω’*)

 

コードはこちらのようになります。☟☟☟

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
#変数 
fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
#y軸csvデータ読み込み 
data = pd.read_csv('cp.csv') 
y = np.array(data)#配列化 
y = y.reshape(-1,)#次元変更(2から1次元) 
#日付のx軸を作成 
x = pd.date_range('2019-08-30 00:00:00', periods=16, freq='d') 
#非線形回帰次数 
x1=np.arange(16) 
fit = np.polyfit(x1,y,5) 
y2 = np.poly1d(fit)(x1) 
#決定係数 
from sklearn.metrics import r2_score 
print(r2_score(y,y2)) 
#予測 
x_30 = np.poly1d(fit)(30) 
print(x_30) 
#グラフ作成 
ax.plot(x,y,'bo') 
ax.plot(x,y2,'--k') 
#グラフフォーマットの指定 
days = mdates.DayLocator() 
daysFmt = mdates.DateFormatter('%m-%d') 
ax.xaxis.set_major_locator(days) 
ax.xaxis.set_major_formatter(daysFmt) 
plt.xlabel("date")#横軸ラベル 
plt.ylabel("price")#縦軸ラベル 
plt.grid(True)#目盛表示 
plt.tight_layout()#全てのプロットをボックス内に 
plt.show()

 

まず,Numpyでの近似曲線描画について解説します.

 

  

 

#非線形回帰次数



  • x1=np.arange(16) 

    ⇒x1という変数に0~15までの配列を入れ込みます。今回のプログラムの場合は経過日数です。



  •  fit = np.polyfit(x1,y,5)

    np.polyfit(x,y,n)  n 次の式で 2 変数(xとy)の最小二乗を行います。



  • y2 = np.poly1d(fit)(x1)

    ⇒ 近似式(fit)に(x1)を代入し、y1の値を生成を生成します.

 

 

つまり、x1を横軸にy1を縦軸に置くことで近似曲線が書けます!!

 

 

 

 

 

 

黒線が近似曲線です!!今回は2次式の曲線です!

 

助手ミルク
助手ミルク
次数を変更するとどうなるんですか??

虎ぱぱ
虎ぱぱ
基本的に次数の数は”節”の数と思ってもらっていいです!次数が増えていくとより複雑な形状の近似曲線が描画できます。

 

 

次数の違いを比較していきますしょう!!

 

 

・2次

 
 
 
 
 
・3次
 
 
 
 
 
・5次
 
 
 
 
 
・10次
 
 
 
 
 
・15次
 
 
 
 
助手ミルク
助手ミルク
すごい!次数を上げていくと実際の値に近づいてきますね!!ト
 

虎ぱぱ
虎ぱぱ
そうですね。でも次数を上げれば上げるほど良いかと言うとそうでもないんです。プロット点数や前提条件との兼ね合いが重要です。

助手ミルク
助手ミルク
ん?点数はわかりますが、前提条件ってなんですか?

虎ぱぱ
虎ぱぱ
今回の場合で言うと、予測をしたい経過日数の時にCreepyNutsさんのCDが売っていることが前提条件です!!つまり結果が価格予想の結果が0円より低く場合,近似曲線がどんなに正確であっても予測が成り立たなくなってしまうということです。

助手ミルク
助手ミルク
なるほど…次数15で計算すると…価格が-になってしまいますね。これじゃダメということね。

[word_balloon id=”2″ position=”R” size=”M” balloon=”talk” name_position=”under_avatar” radius=”true” avatar_border=”false” avatar_shadow=”false” balloon_shadow=”true”]そうです。つまり、前提条件を満たす中でより正確な分析を行うことが重要となります!!

[/word_balloon]

虎ジュニア
虎ジュニア
なんだか今日はしっかりしてるわね。落とし穴がありそう。

 

 

決定係数が超重要!!Scikit-Learnでのr2_scoreで解決!!

 

今回の分析条件を1度整理します!!

 

  • 30日経過時のCreepyNutsのCD価格を予測する。
  • 非線形単回帰を用いて予測する!!妥当な次数を判断する必要がある!
  • 前提はCDが売れ残っていること。つまり価格が0を割る条件は除外する
  • 決定係数の値がより大きいものを信頼する。

30日後の予想価格決定係数を算出するコード重要なりそうですね!!

 

 
 
#予測
 
 
  • x_30 = np.poly1d(fit)(30)

    ⇒算出した 近似式の 経過日数”X”に 30 を代入することで価格”y”を予測・算出する。

#決定係数

 

  • from sklearn.metrics import r2_score

    ⇒Scikit-learnを使用して決定係数を算出するためモジュールを呼び出す。

  • print(r2_score(y,y2))

    ⇒ 実際の価格”y”と近似線曲線での予想価格”y2″を基に決定係数を算出する。

虎ぱぱ
虎ぱぱ
次数を変更していった際の予想価格と決定係数を表に整理します!!

 

 

非線形単回帰次数30日後の予想価格(円)

決定係数(1に近いほど○)

24,9350.068
354,3440.151
4407,8420.289
51139,5740.307
6-1307,0490.505

虎ぱぱ
虎ぱぱ
分析完了!!!予想価格が0を割らないかつ,決定係数が一番高いのは…6次!!予想価格は100万円超え!?ほらほら!!早く買わなきゃ!!

助手ミルク
助手ミルク
100万円超え!?そんなに価格が上がるとは思えないけど…そもそも決定係数も0.3…正確さにかけるんじゃないの!!?ちゃんと分析できてるの!!?

虎ぱぱ
虎ぱぱ
サンプル点数が少なすぎるんだよ…こういう場合にはデータを増やすために補完したりするんだけど…補完の仕方も様々で難しいんだよ。。。。

助手ミルク
助手ミルク
つまりサンプル点数が増えれば正確になるのね!?もう少しじゃあしばらく待ってデータが溜まるのを待つ!!これが一番正確よね!!?また尻尾を出したわね。

虎ぱぱ
虎ぱぱ
この女狐には虎では適わない。

 

 

Pythonの機械学習は独学できないはうそ。高卒の筆者が独学で学んだ話

データサイエンティスト志望者必読の書籍

今回、回帰分析について主に話しましたが、前提条件を設けるというのは機械学習の『決定木』にも関わる部分です。

そういった機械学習の基礎を学び始めた時、基礎から学べるかつわかりやすい勉強方法を模索していた時,この本に出会いました。☟☟☟

Python機械学習プログラミング 達人データサイエンティストによる理論と実践/SebastianRaschka/VahidMirjalili/クイープ【合計3000円以上で送料無料】

価格:4,320
(2019/8/25 22:15時点)
感想(0件)

サブタイトルにもありますが、AIを作るにはまず機械学習の知識が必要です。機械学習を学ぶには統計処理の知識が必要です。

この本は最低限の基礎知識から応用までを網羅的にかつわかりやすく書いてある素晴らしい一冊です。

高卒技術者の筆者でもわかりやすいと感じました。おそらく世の多くの人がわかりやすいと感じるはず(*’ω’*)

世の中のトレンドはすぐ変化する。最新の情報を常に収集する。AIの勉強方法は?

 

近年のAI業界、機械学習業界の進歩は目覚ましく、最適なプログラミングに関する最適な学習方法は常に更新されていきます。

 

私は優秀なビジネスマンや優秀なプログラマーの意見を取り入れ、吸収することも一つの技術であると捉えています。

 

AIの勉強方法についても同じで、今はすごく便利なツールが増えてます。

初心者でもAIを作れる時代になってきたと言えるのではないでしょうか。

PythonでAIの作り方を学ぶ最短ルート【学習ロードマップ-2020年度版】 print("HelloWorld") #Python初心者がAIを作れるようになるためのロードマップ# Pythonを使ってA...

 

 

まとめ Pythonでの非線形回帰にはScikit-learnとNumpyを使う!

 

  • PythonのNumpyとskit-learnを組み合わせることで効率的な回帰分析が可能となる。

     

  • 前提条件を満たしている中で,決定係数が高い次数を設定するのが重要。決定係数はScikit-learnで簡単に算出できる。

     

  • CreepyNutsのCDは価格のサンプルが溜まるまであきらめる。多分買えない。

     

NumpyやScikit-learnはANACONDAというディストリビューションを使うと、Pythonに自動でインストールされます!!AIエンジニアには必須のツールです 😎 

”ANACONDA”でPythonの機械学習やデータ分析を効率化【インストール方法と使い方】Pythonのディストリビューション『ANACONDA』今や機械学習やデータ分析,AIプログラミングには欠かせないアイテムです。AIエンジニアを目指す方はまずインストールしといて間違いないでしょう。この記事を見ればダウンロード⇒インストール⇒動作確認の手順がわかります。...

 

虎ぱぱ
虎ぱぱ
今日の授業はここまで

座右の銘は明日は明日の風が吹く。虎ぱぱでした♪

このエントリーをはてなブックマークに追加
PythonでAIを作ってみたい⇒誰でも勉強すればできる?
虎ジュニア
虎ジュニア
ぱぱー僕もAI作ってみたいよ~機械学習教えてよ~
虎ぱぱ
虎ぱぱ
ジュニアにはまだ早いよ。大人になったらね~
助手ミルク
助手ミルク
ちょっ…いつも挑戦がどうとか言っときながら…子供の夢を奪う気!?AIは誰でも作れるんじゃなかったの!?
虎ぱぱ
虎ぱぱ
そりゃ…いつも言ってる通り、正しく学べば誰でも作れますよ!!(そうは言ってもジュニアは3歳だぞ。)