#1 Scikit-learnで単回帰分析を行う方法

公開日:2018-11-15
最終更新:2018-11-15
※この記事は外部サイト(https://medium.com/@yamasaKit/scikit-learn...)からのクロス投稿です

#1 Scikit-learnで単回帰分析を行う方法

TL; DR

pandas.DataFrame: to_frameメソッドあるいは[[’COLUMN_NAME’]] numpy.array: reshape(-1, 1) を用いて処理をすると良いです。

# Example of pandas.DataFrame
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
# Use RM column as descriptor.
x = df.RM.to_frame() # or df[['RM']]
y = boston.target
regr = LinearRegressor()
regr.fit(x, y) 
# Example of numpy.array
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
boston = load_boston()
X = boston.data
# Use the 6th column RM as descriptor.
x = X[:, 5].reshape(-1, 1)
y = boston.target
regr = LinearRegressor()
regr.fit(x, y)

背景

pandas.DataFrameから一行や一列だけデータを取り出すとpandas.Seriesに、同じくnumpy.arrayは二次元配列から一行や一列だけデータを取り出すと一次元配列になります。

pandas.DataFrameとpandas.Seriesはおおよそ同じような動作をしますがたまに違う動作をする時があります (numpy.arrayの方もしかり)。その一つが表題の単回帰分析を行う時の説明変数です。

scikit-learnの公式のページでは説明変数が一つだけつまり単回帰分析の場合の説明がなく、若干苦戦したので備忘録として書いておきます。

ちなみにエラーにはどうすれば良いかというのは書いてくれてはいます。

# Example of pandas.DataFrame
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target
regr = LinearRegressor()
regr.fit(df.RM, y)
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

エラーを起こすぐらいならついでにreshapeもしてくれたらうれしい。

解決策

pandas.DataFrameの場合

pandas.DataFrameの場合は、取り出したデータのpandas.Seriesのto_frameメソッドを使うとSeriesを無理やりDataFrameに変換できます。

df.RM
0      6.575
1      6.421
2      7.185
       ... 
503    6.976
504    6.794
505    6.030
Name: RM, Length: 506, dtype: float64

最後にName, Length, dtypeが書かれているのでSeries

df.RM.to_frame()
0      6.575
1      6.421
2      7.185
       ... 
503    6.976
504    6.794
505    6.030
[506 rows x 1 columns]

最後にrows, columnsのサイズが書かれているのでDataFrameです。

あるいは一列のみを取り出す時にブラケットを二回重ねてもDataFrameとして出力してくれます。

df[['RM']]
0      6.575
1      6.421
2      7.185
       ... 
503    6.976
504    6.794
505    6.030
[506 rows x 1 columns]

したがって、単回帰分析を行うコードをまとめると最初にお見せした例のようになります。

# Example of pandas.DataFrame
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
# Use RM column as descriptor.
x = df.RM.to_frame() # or df[['RM']]
y = boston.target
regr = LinearRegressor()
regr.fit(x, y)

numpy.arrayの場合

numpy.arrayはreshapeを用いて一次元配列を二次元配列に変換できます。

import numpy as np
arr = np.arange(0, 5)
print(arr)
[0, 1, 2, 3, 4]
print(arr.reshape(-1, 1))
[[0] 
 [1]
 [2]
 [3]
 [4]]

この二次元配列なら単回帰分析を行うことができます。

したがって、単回帰分析を行うコードをまとめると最初にお見せした例のようになります。

# Example of numpy.array
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
boston = load_boston()
X = boston.data
# Use the 6th column RM as descriptor.
x = X[:, 5].reshape(-1, 1)
y = boston.target
regr = LinearRegressor()
regr.fit(x, y)

ちなみにnumpyにはatleast_2dという関数があり、これを使うと出力される結果が一次元配列の場合強制的に二次元配列になります。最初この関数を見た時に、「あ!これは単回帰分析とかしたい時に使うんだな!」と感心して早速使って見ました。

import numpy as np
arr = np.arange(0, 5)
print(np.atleast_2d(arr))
[[0 1 2 3 4]]

そっちかい!np.atleast_2dだと(-1, 1)ではなく(1, -1)になるんですね。

残念ながらnp.atleast_2dはshapeが(1, -1)となるようにして強制的に二次元配列にするので単回帰分析には使えません。これが逆なら美しかったのになぁ。仕方がないのでreshapeを使いましょう。

最後に

重要な説明変数を抽出しそれらで回帰分析を行う、というプログラムを書いていたら気づかないうちに重要な説明変数が一つのみでエラーが出て止まっていた。なんてのはよくあったりします(RでもDataFrameがvectorになって似たようなエラーを出していて原因を発見するのに苦労したりしました)。そういう時にも処理として書いておくと確実に計算がされるので良いかと思います。

Python (version 3.6)

記事が少しでもいいなと思ったらクラップを送ってみよう!
36
+1
@yamasaKit'の技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする