343 KiB
343 KiB
In [2]:
# !!! Данный блок будет работать только в Google-Colab !!!
! gdown 10k8Hwn9kpK9SpK4IEj4-EaWQZqgYT5-Q
! pip install -r /content/requirements_2024_25_for_colab_small.txtDownloading... From: https://drive.google.com/uc?id=10k8Hwn9kpK9SpK4IEj4-EaWQZqgYT5-Q To: C:\Users\mozhu\PycharmProjects\ML_2024\Task5\Base\requirements_2024_25_for_colab_small.txt 0%| | 0.00/375 [00:00<?, ?B/s] 100%|##########| 375/375 [00:00<00:00, 249kB/s]
^C
In [3]:
import catboost
assert (catboost.__version__ == '1.2.7')In [4]:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.simplefilter("ignore")
sns.set(style="darkgrid")
%matplotlib inlineIn [5]:
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 [6]:
from sklearn.linear_model import RidgeIn [7]:
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 [8]:
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.10062207382659173 w2: 0.20124414765318352
In [9]:
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: 20443435586638.3 w2: -6814478528879.264
In [10]:
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.0197
In [11]:
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: 4641.811179703668 Предсказание для первого объекта с шумом: -681.03515625 Предсказание для первого объекта без шума: 0.4140625
In [12]:
np.random.seed(2024)
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], "\tw2:", reg.coef_[1])
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], "\tw2:", reg.coef_[1])w1: -78898433254335.61 w2: 5259895550289.071 w1: 5865168356578.415 w2: 4013009928184.904
In [13]:
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 [14]:
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 [15]:
from sklearn.preprocessing import StandardScalerIn [16]:
scaler = StandardScaler()
# scaler.fit(X_train)
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()}, а дисперсия = {X_train_scaled.var()}")
print(f"Для X_train_scaled:\nСреднее значение = {X_test_scaled.mean()}, а дисперсия = {X_test_scaled.var()}")Для X_train_scaled: Среднее значение = -1.52766934084994e-14, а дисперсия = 1.0000000000000036 Для X_train_scaled: Среднее значение = 0.009713241824084505, а дисперсия = 1.2685666097336878
In [17]:
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LassoIn [18]:
reg = Lasso(alpha=0.5)
reg.fit(X_train_scaled, y_train)
y_pred = reg.predict(X_test_scaled)
print("Test RMSE = %.4f" % mean_squared_error(y_test, y_pred, squared=False))Test RMSE = 0.9798
In [19]:
print("Test MSE = %.4f" % mean_squared_error(y_test, y_pred))Test MSE = 0.9601
In [20]:
reg.coef_Out [20]:
array([ 0.28811554, 0. , 0. , -0. , -0. ,
-0. , -0. , -0. ])In [21]:
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 [22]:
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import PipelineIn [36]:
import pandas as pd
model_lasso = Pipeline([
("scaler", StandardScaler()),
("regr", Lasso())
])
model_ridge = Pipeline([
("scaler", StandardScaler()),
("regr", Ridge())
])
parametrs = {
'regr__alpha': list(np.logspace(-5, 5, 100)),
}
lasso_cv = GridSearchCV(
model_lasso,
parametrs,
cv=5,
scoring="neg_root_mean_squared_error"
)
ridge_cv = GridSearchCV(
model_ridge,
parametrs,
cv=5,
scoring="neg_root_mean_squared_error"
)
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))
# Ваш код: о модели и измеряем качество на тесте
# Можно вызывать predict прямо от обученных lasso_cv и ridge_cv18 0.722366 Name: mean_test_score, dtype: float64 56 0.722381 Name: mean_test_score, dtype: float64
In [37]:
lasso_cv.best_estimator_.named_steps["regr"].coef_Out [37]:
array([ 0.84770117, 0.12584016, -0.27185324, 0.30168796, -0. ,
-0.04062777, -0.88125938, -0.85258618])