328 KiB
328 KiB
In [ ]:
! curl https://raw.githubusercontent.com/MSU-ML-COURSE/ML-COURSE-25-26/refs/heads/master/requirements/requirements.txt -o ./requirements_2025_26_for_colab_small.txt
! pip install -q -r ./requirements_2025_26_for_colab_small.txt[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip is available: [0m[31;49m25.2[0m[39;49m -> [0m[32;49m25.3[0m [1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip install --upgrade pip[0m
In [3]:
import catboost
assert(catboost.__version__ == '1.2.8')In [31]:
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 [32]:
np.random.seed(1)
X = np.random.uniform(0, 1, 100)
Y = X * 0.5 + 0.1 + np.random.randn(100) * 0.1
plt.figure(figsize=(8, 8))
plt.scatter(X, Y)
plt.title("Обучающая выборка зависимости y от x", size=15)
plt.xlabel("x", size=15)
plt.ylabel(r'$\overline{y}$', size=15)
plt.show()In [33]:
from sklearn.linear_model import RidgeIn [34]:
x_axis = np.linspace(0, 1, 200)
fig, axs = plt.subplots(figsize=(14, 7), ncols=2)
axs[0].scatter(X, Y)
w = []
b = []
alphas = [0.0, 0.1, 1.0, 10.0, 100.0, 1000.0]
for alpha in alphas:
reg = Ridge(alpha=alpha) # Задаем параметр alpha
reg.fit(X[:, None], Y)
pred = reg.predict(x_axis[:, None])
w.append(reg.coef_[0])
b.append(reg.intercept_)
axs[0].plot(x_axis, pred, label="alpha=" + str(alpha))
axs[0].legend()
axs[0].set_xlabel("x", size=15)
axs[0].set_ylabel("y", size=15)
axs[0].set_title("Ridge регрессия с разными коэффициентами регуляризации")
axs[1].plot(alphas, w, label="w")
axs[1].plot(alphas, b, label="b")
axs[1].set_xlabel("alpha", size=15)
axs[1].set_ylabel("Значение параметров", size=15)
axs[1].set_title("Значение параметров w и b при разных значениях регуляризации")
axs[1].set_xscale("symlog", linthresh=0.01)
axs[1].legend()
plt.show()In [35]:
np.random.seed(1)
X2 = np.hstack((X[:, None], 2 * X[:, None]))
Y2 = X2[:, 0] * 0.5 + 0.1 + np.random.randn(100) * 0.1
reg = Ridge(alpha=0.0)
reg.fit(X2, Y2)
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])w1: 0.003110369132959204 w2: 0.24999999999999994
In [36]:
np.random.seed(1)
X3 = np.hstack((X[:, None], 3 * X[:, None]))
Y3 = X3[:, 0] * 0.5 + 0.1 + np.random.randn(100) * 0.1
reg = Ridge(alpha=0.0)
reg.fit(X3, Y3)
print("w1:", reg.coef_[0], "\tw2:", reg.coef_[1])w1: 9734611262837.348 w2: -3244870420945.615
In [37]:
np.random.seed(2)
X3_test = np.random.uniform(0, 1, 100)
X3_test = np.hstack((X3_test[:, None], 3 * X3_test[:, None]))
Y3_test = X3_test[:, 0] * 0.5 + 0.1 + np.random.randn(100) * 0.1
Y3_test_pred = np.sum(reg.coef_[None] * X3_test + reg.intercept_, axis=1)
print("MSE loss: %.4f" % np.mean((Y3_test_pred - Y3_test) ** 2))MSE loss: 0.0219
In [38]:
X3_test[0, 1] = X3_test[0, 1] + 1e-10
Y3_test_pred_noisy = np.sum(reg.coef_[None] * X3_test + reg.intercept_, axis=1)
print("MSE loss:", np.mean((Y3_test_pred_noisy - Y3_test) ** 2))
print("Предсказание для первого с шумом: ", Y3_test_pred_noisy[0])
print("Предсказание для первого без шума: ", Y3_test_pred[0])MSE loss: 1051.9490520394384 Предсказание для первого с шумом: -324.0625 Предсказание для первого без шума: 0.4248046875
In [39]:
X_4 = np.random.uniform(0, 1, 100)
X_4 = np.hstack((X_4[:, None], 15 * X_4[:, None]))
Y_4 = X_4[:, 0] * 0.5 + 0.1 + np.random.randn(100) * 0.1
reg = Ridge(alpha=0.0)
reg.fit(X_4, Y_4)
print("w1:", reg.coef_[0], "\nw2:", reg.coef_[1])
print("-----")
X_5 = np.random.uniform(0, 1, 100)
X_5 = np.hstack((X_5[:, None], -19 / 13 * X_5[:, None]))
Y_5 = X_5[:, 0] * 0.5 + 0.1 + np.random.randn(100) * 0.1
reg = Ridge(alpha=0.0)
reg.fit(X_5, Y_5)
print("w1:", reg.coef_[0], "\nw2:", reg.coef_[1])w1: 1696626244189.3145 w2: -113108416279.25912 ----- w1: -0.24676691369166734 w2: -0.5
In [40]:
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2024)In [41]:
with np.printoptions(formatter={'float': '{: 0.3f}'.format}):
print(X_train.mean(axis=0))[ 3.868 28.712 5.411 1.093 1416.185 3.109 35.637 -119.583]
In [42]:
from sklearn.preprocessing import StandardScalerIn [43]:
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
print(f"X_train_scaled:\nСреднее значение = {X_train_scaled.mean()}\nдисперсия = {X_train_scaled.var()}\n")
print(f"X_train_scaled:\nСреднее значение = {X_test_scaled.mean()}\nдисперсия = {X_test_scaled.var()}")X_train_scaled: Среднее значение = -1.5276078667068268e-14 дисперсия = 1.0000000000000033 X_train_scaled: Среднее значение = 0.009713241824084506 дисперсия = 1.2685666097336883
In [44]:
from sklearn.metrics import mean_squared_error, root_mean_squared_error
from sklearn.linear_model import LassoIn [45]:
reg = Lasso(alpha=0.5)
reg.fit(X_train_scaled, y_train)
y_pred = reg.predict(X_test_scaled)
print("Test RMSE = %.4f" % root_mean_squared_error(y_test, y_pred))Test RMSE = 0.9798
In [46]:
reg.coef_Out [46]:
array([ 0.28811554, 0. , 0. , -0. , -0. ,
-0. , -0. , -0. ])In [47]:
reg = Ridge(alpha=0.5)
reg.fit(X_train_scaled, y_train)
print(reg.coef_)[ 8.50854581e-01 1.25545440e-01 -2.78892640e-01 3.08812622e-01 -1.99686054e-04 -4.12942247e-02 -8.88296917e-01 -8.60046905e-01]
In [48]:
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import PipelineIn [50]:
model_lasso = Pipeline([
("scaler", StandardScaler()),
("regr", Lasso())
])
model_ridge = Pipeline([
("scaler", StandardScaler()),
("regr", Ridge())
])
parametrs = {
'regr__alpha': list(np.logspace(-5, 6, 12)),
}
lasso_cv = GridSearchCV(
model_lasso,
cv=5,
scoring="neg_root_mean_squared_error",
param_grid = parametrs
)
ridge_cv = GridSearchCV(
model_ridge,
cv=5,
scoring="neg_root_mean_squared_error",
param_grid = parametrs
)
lasso_cv.fit(X_train, y_train)
ridge_cv.fit(X_train, y_train)
lasso_res = pd.DataFrame(lasso_cv.cv_results_)
ridge_res = pd.DataFrame(ridge_cv.cv_results_)
print(-lasso_res['mean_test_score'].sort_values(ascending=False).head(1))
print(-ridge_res['mean_test_score'].sort_values(ascending=False).head(1))2 0.72237 Name: mean_test_score, dtype: float64 5 0.722382 Name: mean_test_score, dtype: float64
In [51]:
lasso_cv.best_estimator_.named_steps["regr"].coef_Out [51]:
array([ 0.84604739, 0.12597833, -0.26816238, 0.29792527, 0. ,
-0.04027369, -0.87740579, -0.84850035])