Pythonチュートリアル

Pythonホーム Pythonイントロ Pythonはじめに Python構文 Pythonコメント Python変数 Pythonデータ型 Python番号 Pythonキャスティング Python文字列 Pythonブール値 Python演算子 Pythonリスト Pythonタプル Pythonセット Python辞書 Python If ... Else PythonのWhileループ PythonForループ Python関数 Python Lambda Python配列 Pythonクラス/オブジェクト Pythonの継承 Pythonイテレータ Pythonスコープ Pythonモジュール Pythonの日付 Python数学 Python JSON Python RegEx Python PIP Python試してみてください... Pythonユーザー入力 Python文字列フォーマット

ファイル処理

Pythonファイル処理 Python読み取りファイル Python書き込み/ファイルの作成 Pythonファイルの削除

Pythonモジュール

NumPyチュートリアル パンダ攻略 Scipyチュートリアル

Python Matplotlib

Matplotlibイントロ Matplotlibはじめに Matplotlib Pyplot Matplotlibプロット Matplotlibマーカー Matplotlibライン Matplotlibラベル Matplotlibグリッド Matplotlibサブプロット Matplotlib散布図 Matplotlibバー Matplotlibヒストグラム Matplotlib円グラフ

機械学習

入門 平均中央値モード 標準偏差 パーセンタイル データ配信 正規データ分布 散布図 線形回帰 多項式回帰 重回帰 規模 トレーニング/テスト デシジョンツリー

Python MySQL

MySQLはじめに MySQLデータベースの作成 MySQLテーブルの作成 MySQL挿入 MySQL Select MySQL Where MySQL Order By MySQL削除 MySQLドロップテーブル MySQLアップデート MySQLの制限 MySQL参加

Python MongoDB

MongoDBはじめに MongoDBデータベースの作成 MongoDBCreateコレクション MongoDBインサート MongoDB検索 MongoDBクエリ MongoDBソート MongoDB削除 MongoDBドロップコレクション MongoDBアップデート MongoDBの制限

Pythonリファレンス

Pythonの概要 Python組み込み関数 Python文字列メソッド Pythonリストメソッド Python辞書メソッド Pythonタプルメソッド Pythonセットメソッド Pythonファイルメソッド Pythonキーワード Pythonの例外 Python用語集

モジュールリファレンス

ランダムモジュール リクエストモジュール 統計モジュール 数学モジュール cMathモジュール

Pythonハウツー

リストの重複を削除する 文字列を逆にする 2つの数字を追加する

Pythonの例

Pythonの例 Pythonコンパイラ Python演習 Pythonクイズ Python証明書

機械学習-線形回帰


回帰

回帰という用語は、変数間の関係を見つけようとするときに使用されます。

機械学習や統計モデリングでは、その関係を使用して将来のイベントの結果を予測します。


線形回帰

線形回帰は、データポイント間の関係を使用して、すべてのデータポイントを通る直線を描画します。

この線は、将来の値を予測するために使用できます。

機械学習では、将来を予測することが非常に重要です。


それはどのように機能しますか?

Pythonには、データポイント間の関係を見つけ、線形回帰の線を引くためのメソッドがあります。数式を使用する代わりに、これらの方法を使用する方法を示します。

以下の例では、x軸は年齢を表し、y軸は速度を表します。料金所を通過する13台の車の年齢と速度を登録しました。収集したデータを線形回帰で使用できるかどうかを見てみましょう。

散布図を描くことから始めます。

import matplotlib.pyplot as plt

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

plt.scatter(x, y)
plt.show()

結果:

scipy線形回帰の線をインポートして描画します。

import matplotlib.pyplot as plt
from scipy import stats

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

slope, intercept, r, p, std_err = stats.linregress(x, y)

def myfunc(x):
  return slope * x + intercept

mymodel = list(map(myfunc, x))

plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

結果:

例の説明

必要なモジュールをインポートします。

Matplotlibモジュールについては、 Matplotlibチュートリアルで学ぶことができます

SciPyモジュールについては、 SciPyチュートリアルで学ぶことができます

import matplotlib.pyplot as plt
from scipy import stats

x軸とy軸の値を表す配列を作成します。

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

線形回帰のいくつかの重要なキー値を返すメソッドを実行します。

slope, intercept, r, p, std_err = stats.linregress(x, y)

slopeおよび 値を使用しinterceptて新しい値を返す関数を作成します。この新しい値は、対応するx値がy軸のどこに配置されるかを表します。

def myfunc(x):
  return slope * x + intercept

関数を介してx配列の各値を実行します。これにより、y軸に新しい値を持つ新しい配列が作成されます。

mymodel = list(map(myfunc, x))

元の散布図を描画します。

plt.scatter(x, y)

線形回帰の線を引きます:

plt.plot(x, mymodel)

図を表示します。

plt.show()



関係のR

x軸の値とy軸の値の関係がどのようになっているのかを知ることは重要です。関係がない場合、線形回帰を使用して何も予測することはできません。

この関係(相関係数)はと呼ばれ rます。

値のr範囲は-1から1で、0は関係がないことを意味し、1(および-1)は100%関連していることを意味します。

PythonとScipyモジュールがこの値を計算します。必要なのは、x値とy値をフィードすることだけです。

私のデータは線形回帰にどの程度適合していますか?

from scipy import stats

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

slope, intercept, r, p, std_err = stats.linregress(x, y)

print(r)

注:結果-0.76は、完全ではなく関係があることを示していますが、将来の予測で線形回帰を使用できることを示しています。


将来の価値を予測する

これで、収集した情報を使用して将来の値を予測できます。

例:10年前の車の速度を予測してみましょう。

そのためには、myfunc()上記の例と同じ関数が必要です。

def myfunc(x):
  return slope * x + intercept

10年前の車の速度を予測します。

from scipy import stats

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

slope, intercept, r, p, std_err = stats.linregress(x, y)

def myfunc(x):
  return slope * x + intercept

speed = myfunc(10)

print(speed)

この例では、85.6の速度を予測しました。これは、図からも読み取ることができます。


フィット感が悪い?

線形回帰が将来の値を予測するための最良の方法ではない例を作成しましょう。

x軸とy軸のこれらの値は、線形回帰に非常によく適合しないはずです。

import matplotlib.pyplot as plt
from scipy import stats

x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]

slope, intercept, r, p, std_err = stats.linregress(x, y)

def myfunc(x):
  return slope * x + intercept

mymodel = list(map(myfunc, x))

plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

結果:

そして、r関係のために?

非常に低いr値を取得する必要があります。

import numpy
from scipy import stats

x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]

slope, intercept, r, p, std_err = stats.linregress(x, y)

print(r)

結果:0.013は非常に悪い関係を示し、このデータセットが線形回帰に適していないことを示しています。