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
Формируем случайный тестовый набор
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()
X = np.array(x).reshape(len(x),1)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
lr = LinearRegression().fit(X_train, y_train)
print("lr.coef_: {}".format(lr.coef_))
print("lr.intercept_: {}".format(lr.intercept_))
print("Правильность на обучающем наборе: {:.2f}".format(lr.score(X_train, y_train)))
print("Правильность на тестовом наборе: {:.2f}".format(lr.score(X_test, y_test)))
start = np.array(x).min()
stop = np.array(x).max()
num = 100
x1 = np.linspace(start, stop, num)
x1 = x1.reshape(len(x1),1)
y1 = lr.predict(x1)
plt.plot(x,y,'bo')
plt.plot(x1,y1,'m.')
plt.grid()
Формируем тестовый набор данных с точками, разбросанными относительно параболы.
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
data = pd.DataFrame({'x': x, 'y': y})
data['x2'] = data['x']**2
X = data[['x','x2']]
y = data['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
lr = LinearRegression().fit(X_train, y_train)
print("lr.coef_: {}".format(lr.coef_))
print("lr.intercept_: {}".format(lr.intercept_))
print("Правильность на обучающем наборе: {:.2f}".format(lr.score(X_train, y_train)))
print("Правильность на тестовом наборе: {:.2f}".format(lr.score(X_test, y_test)))
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
y1 = lr.predict(data_test[['x','x2']])
plt.plot(x,y,'bo')
plt.plot(x1,y1,'m.')
plt.grid()