Все корректно, маленькие детали:
По пунктам:
- pd.get_dummies - для исследованя подходит, но для продакшн кода лучше использовать sklearn.preprocessing.OneHotEncoder. Там больше контроля для кодирования фичей (например если у тебя не все значения представлены в обучающей выборке)
- X_mean = X_train_num.mean(axis=0)
X_std = X_train_num.std(axis=0)
X_train_num_scaled = (X_train_num - X_mean) / X_std
Есть в sklearn встроенный класс sklearn.preprocessing.StandardScaler
- I = np.eye(X_train_scaled.shape[1])
I[0, 0] = 0
alpha = 0.01
theta = np.linalg.inv(X_train_scaled.T @ X_train_scaled + alpha * I) @ (
X_train_scaled.T @ y_train
)
Это sklearn.linear_model.Ridge
Такая реализация как у тебя имеет смысл (классно, что понимаешь как все работает), но, например, для подбора модели лучше использовать классы которые можно объединить в Pipeline без переписывания кода (при проведении исследований тебе придется перебирать очень много вариантов моделей, признаков, их преобразований и под каждый из них переписывать код будет очень медленно). Примерно это выглядит так:
numeric_transformer = Pipeline(steps=[
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))
])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, NUMERICAL_FEATURES),
('cat', categorical_transformer, CATEGORICAL_FEATURES)
])
model = Pipeline(steps=[
('preprocessor', preprocessor),
('regressor', Ridge())
])
model.fit(X_train, y_train)
Все корректно, маленькие детали:
По пунктам:
X_std = X_train_num.std(axis=0)
X_train_num_scaled = (X_train_num - X_mean) / X_std
Есть в sklearn встроенный класс sklearn.preprocessing.StandardScaler
I[0, 0] = 0
alpha = 0.01
theta = np.linalg.inv(X_train_scaled.T @ X_train_scaled + alpha * I) @ (
X_train_scaled.T @ y_train
)
Это sklearn.linear_model.Ridge
Такая реализация как у тебя имеет смысл (классно, что понимаешь как все работает), но, например, для подбора модели лучше использовать классы которые можно объединить в Pipeline без переписывания кода (при проведении исследований тебе придется перебирать очень много вариантов моделей, признаков, их преобразований и под каждый из них переписывать код будет очень медленно). Примерно это выглядит так:
numeric_transformer = Pipeline(steps=[
('scaler', StandardScaler())
])
model = Pipeline(steps=[
('preprocessor', preprocessor),
('regressor', Ridge())
])