web-dev-qa-db-ja.com

scikit-learnLinearRegressionを使用して線形フィットをプロットする

父親の長さから息子の長さを予測する線形回帰モデルを作成しようとしています

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
%matplotlib inline
from sklearn.linear_model import LinearRegression


Headings_cols = ['Father', 'Son']
df = pd.read_csv('http://www.math.uah.edu/stat/data/Pearson.txt', 
                 delim_whitespace=True, names=Headings_cols)



X = df['Father']  
y = df['Son']  

model2 = LinearRegression()
model2.fit(y, X)

plt.scatter(X, y,color='g')
plt.plot(X, model.predict(X),color='g')

plt.scatter(y, X, color='r')
plt.plot(y, X, color='r')

エラーが発生します

ValueError: could not convert string to float: 'Father'

2つ目は、息子の平均の長さと平均の標準誤差を計算することです。

6
user5573514

ここには2つの主要な問題があります。

  1. ソースからデータを取得する
  2. _sklearn.LinearRegression.fit_ が理解できる形にデータを取得する

1。データを取り出す
ソースファイルには、列名を含むヘッダー行が含まれています。データに列名を付けたくないので、データ全体をデータフレームdfに読み込んだ後、最初の行をヘッダーとして使用するように指示できます。
df.head()。これにより、後で通常どおり列名、つまり_df['Father']_でデータフレームをクエリできます。

2。データを形にする
_sklearn.LinearRegression.fit_ は2つの引数を取ります。最初に「トレーニングデータ」(2D配列である必要があります)、次に「ターゲット値」。ここで検討するケースでは、単純に何を適合させるかということなので、概念についてはあまり気にしませんが、その関数への最初の入力を目的の形状にする必要があります。これは、配列の1つに新しい軸を作成することで簡単に実行できます。つまり、_df['Father'].values[:,np.newaxis]_

完全に機能するスクリプト:

_import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns

from sklearn.linear_model import LinearRegression

df = pd.read_csv('http://www.math.uah.edu/stat/data/Pearson.txt',
                 delim_whitespace=True)
df.head() # prodce a header from the first data row


# LinearRegression will expect an array of shape (n, 1) 
# for the "Training data"
X = df['Father'].values[:,np.newaxis]
# target data is array of shape (n,) 
y = df['Son'].values


model2 = LinearRegression()
model2.fit(X, y)

plt.scatter(X, y,color='g')
plt.plot(X, model2.predict(X),color='k')

plt.show()
_

enter image description here