added coments

This commit is contained in:
Milana Ievlewa 2024-11-09 11:05:06 +04:00
parent df4807be6a
commit f2bc09d4fb

View File

@ -778,7 +778,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": null,
"metadata": {},
"outputs": [
{
@ -858,7 +858,10 @@
"labels = ['0-2', '2-4', '4-6', '6-8', '8-10', '10-12', '12-14', '14-16', '16+'] # Названия категорий\n",
"\n",
"# Создание нового столбца 'Close_Disc' на основе дискретизации\n",
"df['Close_Disc'] = pd.cut(df['Close'], bins=bins, labels=labels, include_lowest=True)\n",
"df['Close_Disc'] = pd.cut(df['Close'], bins=bins, labels=labels, include_lowest=True) #pd.cut выполняет дискретизацию переменной\n",
"#include_lowest=True: Этот параметр гарантирует, что самое нижнее значение (в данном случае 0), будет входить в первую категорию.\n",
"\n",
"\n",
"\n",
"# Проверка результата\n",
"print(\"После дискретизации 'Close':\")\n",
@ -878,7 +881,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": null,
"metadata": {},
"outputs": [
{
@ -981,6 +984,9 @@
"X_resampled['Volume_Change'] = X_resampled['Volume'].pct_change()\n",
"X_test['Volume_Change'] = X_test['Volume'].pct_change()\n",
"X_val['Volume_Change'] = X_val['Volume'].pct_change()\n",
"# Результатом работы pct_change() является серия, где каждое значение представляет собой \n",
"# процентное изменение относительно предыдущего значения. Первое значение всегда будет NaN, \n",
"# так как для него нет предшествующего значения для сравнения.\n",
"\n",
"# Проверка создания новых признаков\n",
"print(\"\\nНовые признаки в обучающей выборке:\")\n",
@ -1135,7 +1141,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": null,
"metadata": {},
"outputs": [
{
@ -1262,6 +1268,9 @@
"fillna_X_resampled = X_resampled[['Volume_Change']].fillna(0)\n",
"fillna_X_test = X_test[['Volume_Change']].fillna(0)\n",
"fillna_X_val = X_val[['Volume_Change']].fillna(0)\n",
"# используется для заполнения всех значений NaN \n",
"# (Not a Number) в DataFrame или Series указанным значением. \n",
"# В данном случае, fillna(0) заполняет все ячейки, содержащие NaN, значением 0.\n",
"\n",
"\n",
"print(fillna_df.shape)\n",
@ -1383,7 +1392,7 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": null,
"metadata": {},
"outputs": [
{
@ -1437,6 +1446,8 @@
"X_resampled[numerical_features] = scaler.fit_transform(X_resampled[numerical_features])\n",
"X_val[numerical_features] = scaler.transform(X_val[numerical_features])\n",
"X_test[numerical_features] = scaler.transform(X_test[numerical_features])\n",
"# fit() - вычисляет среднее и стандартное отклонение для каждого признака в наборе данных.\n",
"# transform() - применяет расчеты, чтобы стандартизировать данные по приведенной выше формуле.\n",
"\n",
"# Вывод результатов после масштабирования\n",
"print(\"Результаты после масштабирования:\")\n",
@ -1468,7 +1479,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": null,
"metadata": {},
"outputs": [
{
@ -1561,7 +1572,7 @@
"# Создание EntitySet\n",
"es = ft.EntitySet(id='stock_data')\n",
"\n",
"# Добавление датафрейма с домами\n",
"# Добавление датафрейма с акциями\n",
"es = es.add_dataframe(dataframe_name='stocks', dataframe=df, index='id')\n",
"\n",
"# Генерация признаков с помощью глубокой синтезы признаков\n",
@ -1580,10 +1591,12 @@
"\n",
"# Генерация признаков\n",
"feature_matrix, feature_defs = ft.dfs(entityset=es, target_dataframe_name='stocks', max_depth=2)\n",
"# Она автоматически генерирует новые признаки из исходного датафрейма и производит агрегацию по связям.\n",
"\n",
"# Преобразование признаков для контрольной и тестовой выборок\n",
"val_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=X_val.index)\n",
"test_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=X_test.index)\n",
"#генерирует матрицы признаков для контрольной и тестовой выборок, используя идентификаторы экземпляров из X_val.index и X_test.index соответственно.\n",
"\n",
"print(feature_matrix.head())\n"
]
@ -1614,7 +1627,7 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": null,
"metadata": {},
"outputs": [
{
@ -2047,14 +2060,24 @@
"\n",
"# Обучение модели\n",
"model1 = LinearRegression()\n",
"#Линейная регрессия — это простая модель, которая пытается установить связь между двумя переменными, рисуя прямую линию на графике. \n",
"# Она прогнозирует значение зависимой переменной (Y) на основе одной или нескольких независимых переменных (X).\n",
"model2 = DecisionTreeRegressor()\n",
"model3 = RandomForestRegressor(n_estimators=100) # Количество деревьев в лесу\n",
"#Это модель, которая принимает решения, дробя данные на «ветви», как дерево. На каждом уровне дерева модель выбирает, \n",
"# какой признак (фактор) использовать для разделения данных.\n",
"model3 = RandomForestRegressor(n_estimators=100) \n",
"#Случайный лес — это ансамблевая модель, которая использует множество деревьев решений. \n",
"# Вместо того чтобы полагаться на одно дерево, она комбинирует результаты нескольких деревьев, чтобы получить более точные предсказания.\n",
"model4 = Lasso(alpha=0.1)\n",
"#Lasso регрессия — это разновидность линейной регрессии с добавлением регуляризации. \n",
"# Она помогает избежать переобучения модели, уменьшая влияние некоторых признаков.\n",
"model5 = Ridge(alpha=0.1)\n",
"#Ridge регрессия похожа на Lasso, но вместо полного исключения некоторых переменных она уменьшает значения всех коэффициентов.\n",
"\n",
"print('\\nLinearRegression:')\n",
"start_time = time.time()\n",
"model1.fit(X_train, y_train)\n",
"#Метод fit обучает модель на обучающем наборе данных, состоящем из X_train (набор данных) и y_train (целевая переменная).\n",
"\n",
"# Время обучения модели\n",
"train_time = time.time() - start_time\n",
@ -2062,8 +2085,11 @@
"y_predict = model1.predict(X_test)\n",
"\n",
"mse = mean_squared_error(y_test, y_predict, squared=False)\n",
"# Этот показатель показывает, насколько в среднем наши предсказания отклоняются от фактических значений. Чем меньше RMSE, тем лучше модель.\n",
"r2 = r2_score(y_test, y_predict)\n",
"# Коффициент детерминации - показывает, насколько модель объясняет разброс значений в наборе данных\n",
"mae = mean_absolute_error(y_test, y_predict)\n",
"# Измеряет среднее расстояние между предсказанными значениями и фактическими значениями, игнорируя направление ошибок.\n",
"print(f'Коэффициент детерминации R²: {r2:.2f}')\n",
"print(f'Время обучения модели: {train_time:.2f} секунд')\n",
"print(f'Среднеквадратичная ошибка: {mse:.2f}')\n",
@ -2072,6 +2098,18 @@
"scores = cross_val_score(model1, X_train, y_train, cv=5, scoring='neg_mean_squared_error')\n",
"rmse_cv = (-scores.mean())**0.5\n",
"print(f\"Кросс-валидация RMSE: {rmse_cv} \\n\")\n",
"# Здесь мы используем метод cross_val_score для оценки модели с помощью кросс-валидации. \n",
"# cv=5 означает, что мы будем разбивать наш обучающий набор на 5 частей (фолдов) и \n",
"# использовать каждую часть для тестирования модели, обученной на остальных частях. \n",
"# (по сути разбивка на выборки но несколько раз с использованием разных разбиений, чтобы получить норм оценку)\n",
"\n",
"# Параметр scoring='neg_mean_squared_error' говорит о том, что мы хотим получать отрицательные значения среднеквадратичной ошибки, \n",
"# так как cross_val_score возвращает лучшие результаты как положительные значения. Таким образом, использование отрицательного \n",
"# значения MSE позволяет \"перевернуть\" метрику так, чтобы более низкие значения (более точные предсказания) приводили \n",
"# к более высоким (в терминах абсолютного значения) результатам.\n",
"\n",
"# После этого мы берем среднее значение отрицательной MSE и берем его корень (RMSE) \n",
"# для получения усредненной оценки ошибки модели через кросс-валидацию.\n",
"\n",
"\n",
"# Визуализация результатов\n",