Линейные модели

In [1]:
import numpy as np
import pandas as pd
import random
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline

Линейная регрессия

Формируем случайный тестовый набор

In [3]:
n_x = 50
a_x = -3
b_x = 3
x =[random.uniform(a_x, b_x) for _ in range(n_x)]
a_y = 1.5
b_y =0.5
s_y = 0.5
y = [a_y * u + b_y + random.gauss(0, s_y) for u in x ]
plt.plot(x,y,'bo')
plt.grid()
In [4]:
X = np.array(x).reshape(len(x),1)
In [5]:
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
lr = LinearRegression().fit(X_train, y_train)
In [6]:
print("lr.coef_: {}".format(lr.coef_))
print("lr.intercept_: {}".format(lr.intercept_))
lr.coef_: [1.39169412]
lr.intercept_: 0.5549069855671888
In [7]:
print("Правильность на обучающем наборе: {:.2f}".format(lr.score(X_train, y_train)))
print("Правильность на тестовом наборе: {:.2f}".format(lr.score(X_test, y_test)))
Правильность на обучающем наборе: 0.96
Правильность на тестовом наборе: 0.96
In [ ]:
 
In [8]:
start = np.array(x).min()
stop = np.array(x).max()
num = 100
x1 = np.linspace(start, stop, num)
x1 = x1.reshape(len(x1),1)
In [9]:
y1 = lr.predict(x1)
plt.plot(x,y,'bo')
plt.plot(x1,y1,'m.')
plt.grid()

Формируем тестовый набор данных с точками, разбросанными относительно параболы.

In [10]:
n_x = 50
a_x = -3
b_x = 3
x =[random.uniform(a_x, b_x) for _ in range(n_x)]
d_y = 2
a_y = 1.5
b_y =0.5
s_y = 0.5
y = [d_y * u**2 + a_y * u + b_y + random.gauss(0, s_y) for u in x ]
plt.plot(x,y,'bo')
plt.grid()

Во многих задачах регрессию требуется построить для данных собранных в pd.DataFrame

In [14]:
data = pd.DataFrame({'x': x, 'y': y})
data['x2'] = data['x']**2
In [15]:
X = data[['x','x2']]
y = data['y']
In [16]:
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
lr = LinearRegression().fit(X_train, y_train)
In [17]:
print("lr.coef_: {}".format(lr.coef_))
print("lr.intercept_: {}".format(lr.intercept_))
lr.coef_: [1.52468318 1.9975479 ]
lr.intercept_: 0.4347529162844923
In [18]:
print("Правильность на обучающем наборе: {:.2f}".format(lr.score(X_train, y_train)))
print("Правильность на тестовом наборе: {:.2f}".format(lr.score(X_test, y_test)))
Правильность на обучающем наборе: 0.99
Правильность на тестовом наборе: 0.99
In [22]:
start = np.array(x).min()
stop = np.array(x).max()
num = 100
x1 = np.linspace(start, stop, num)
data_test = pd.DataFrame({'x': x1})
data_test['x2'] = data_test['x'] ** 2
In [23]:
y1 = lr.predict(data_test[['x','x2']])
plt.plot(x,y,'bo')
plt.plot(x1,y1,'m.')
plt.grid()
In [ ]: