304 KiB
304 KiB
In [ ]:
from sklearn.metrics import mean_squared_error
# !!! Данный блок будет работать только в Google-Colab !!!
! gdown 10k8Hwn9kpK9SpK4IEj4-EaWQZqgYT5-Q
! pip install -r /content/requirements_2024_25_for_colab_small.txtIn [ ]:
import catboost
assert (catboost.__version__ == '1.2.7')In [2]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.simplefilter("ignore")
sns.set(style="darkgrid")
%matplotlib inlineIn [3]:
from sklearn.linear_model import RidgeIn [4]:
np.random.seed(1)
X = np.random.uniform(0, 1, 100)
Y = X * 0.5 + 0.1 + np.random.randn(100) * 0.1
X3 = np.hstack((X[:, None], 3 * X[:, None]))
Y3 = X3[:, 0] * 0.5 + 0.1 + np.random.randn(100) * 0.1In [5]:
w1 = []
w2 = []
alphas = [0.01, 0.1, 1, 10, 100, 1000]
for alpha in alphas:
reg = Ridge(alpha=alpha)
reg.fit(X3, Y3)
w1.append(reg.coef_[0])
w2.append(reg.coef_[1])
w1 = np.array(w1)
w2 = np.array(w2)
fig, axs = plt.subplots(figsize=(14, 7), ncols=2)
axs[0].plot(alphas, w1, label="w1")
axs[0].plot(alphas, w2, label="w2")
axs[0].set_xscale("log")
axs[0].set_title("Веса регрессии при разных alpha")
axs[0].set_xlabel("alpha")
axs[0].set_ylabel("Значение весов")
axs[0].legend()
axs[1].plot(alphas, w2 / w1, label="отношение w2 к w1", linewidth=10)
axs[1].plot([0.01, 1000], [3, 3], label="отношение x2 к x1", linestyle="--", linewidth=8)
axs[1].set_xscale("log")
axs[1].set_ylim(2, 4)
axs[1].set_xlabel("alpha")
axs[1].set_ylabel("Значение отношения")
axs[1].set_title("Отношение весов")
axs[1].legend()
plt.show()In [6]:
from sklearn.linear_model import LassoIn [7]:
reg = Lasso(alpha=1., max_iter=1000, tol=1e-4)
reg.fit(X3, Y3)
print("Веса, при alpha = 1.")
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])
print()
reg = Lasso(alpha=0.1, max_iter=1000, tol=1e-4)
reg.fit(X3, Y3)
print("Веса, при alpha = 0.1")
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])
print()
reg = Lasso(alpha=0.01, max_iter=1000, tol=1e-4)
reg.fit(X3, Y3)
print("Веса, при alpha = 0.01")
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])
print()
reg = Lasso(alpha=0.001, max_iter=1000, tol=1e-4)
reg.fit(X3, Y3)
print("Веса, при alpha = 0.001")
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])
print()
reg = Lasso(alpha=0.0001, max_iter=1000, tol=1e-4)
reg.fit(X3, Y3)
print("Веса, при alpha = 0.0001")
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])
print()
reg = Lasso(alpha=0.00001, max_iter=1000, tol=1e-4)
reg.fit(X3, Y3)
print("Веса, при alpha = 0.00001")
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])
print()Веса, при alpha = 1. w1: 0.0 w2: 0.0 Веса, при alpha = 0.1 w1: 0.0 w2: 0.029684463509327023 Веса, при alpha = 0.01 w1: 0.0 w2: 0.14506160917248503 Веса, при alpha = 0.001 w1: 0.0 w2: 0.1565993237388008 Веса, при alpha = 0.0001 w1: 0.0 w2: 0.15775309519543243 Веса, при alpha = 0.00001 w1: 0.39668731991454986 w2: 0.025639365702912618
In [8]:
reg = Lasso(alpha=0.00001, max_iter=10000, tol=1e-4)
reg.fit(X3, Y3)
print("Веса, при alpha = 0.00001")
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])
print()Веса, при alpha = 0.00001 w1: 0.0 w2: 0.15786847234109586
In [69]:
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
def generate_polynomial_data(n_samples):
X = np.linspace(-10, 10, n_samples)
coeffs = [-1, 3, 2] # Коэффициенты для x^2, x^1, x^0
y = np.polyval(coeffs, X) + np.random.uniform(0, 1, n_samples)
X = X.reshape(-1, 1)
return X, y
# Генерация 500 образцов
X4, Y4 = generate_polynomial_data(500)
X4_train, X4_test, Y4_train, Y4_test = train_test_split(X4, Y4, test_size=0.2, random_state=50)
reg = Ridge(alpha=0.1)
reg.fit(X4_train, Y4_train)
Y4_pred = reg.predict(X4_test)
print("MSE для нашей модели: ", mean_squared_error(Y4_test, Y4_pred))
plt.figure(figsize=(18, 6))
# Линейная регрессия без полинома
plt.subplot(1, 3, 1)
plt.scatter(X4, Y4, color='blue', label='Данные')
plt.scatter(X4_test, Y4_pred, color='red', label='Предсказание модели')
plt.xlabel('Признак X')
plt.ylabel('Целевая переменная y')
plt.title('Данные с полиномиальной зависимостью')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()MSE для нашей модели: 805.0142195307291
In [67]:
X1 = np.random.randn(100, 1)
X2 = np.ones((100, 1))*10
Y = 3 * X1
X = np.hstack((X1, X2))
ridge = Ridge(alpha=0.5)
ridge.fit(X, Y)
print("Коэффициенты Ridge-регрессии:")
print(f"w1 (X1): {ridge.coef_[0][0]:.4f}")
print(f"w2 (X2): {ridge.coef_[0][1]}")Коэффициенты Ridge-регрессии: w1 (X1): 2.9841 w2 (X2): 0.0