2025-02-13 23:39:55 +04:00

276 KiB
Raw Permalink Blame History

Загрузка данных

In [1]:
import pandas as pd
df = pd.read_csv("../static/csv/FINAL_USO.csv")
print(df.columns)
df
Index(['Date', 'Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume',
       'SP_open', 'SP_high', 'SP_low', 'SP_close', 'SP_Ajclose', 'SP_volume',
       'DJ_open', 'DJ_high', 'DJ_low', 'DJ_close', 'DJ_Ajclose', 'DJ_volume',
       'EG_open', 'EG_high', 'EG_low', 'EG_close', 'EG_Ajclose', 'EG_volume',
       'EU_Price', 'EU_open', 'EU_high', 'EU_low', 'EU_Trend', 'OF_Price',
       'OF_Open', 'OF_High', 'OF_Low', 'OF_Volume', 'OF_Trend', 'OS_Price',
       'OS_Open', 'OS_High', 'OS_Low', 'OS_Trend', 'SF_Price', 'SF_Open',
       'SF_High', 'SF_Low', 'SF_Volume', 'SF_Trend', 'USB_Price', 'USB_Open',
       'USB_High', 'USB_Low', 'USB_Trend', 'PLT_Price', 'PLT_Open', 'PLT_High',
       'PLT_Low', 'PLT_Trend', 'PLD_Price', 'PLD_Open', 'PLD_High', 'PLD_Low',
       'PLD_Trend', 'RHO_PRICE', 'USDI_Price', 'USDI_Open', 'USDI_High',
       'USDI_Low', 'USDI_Volume', 'USDI_Trend', 'GDX_Open', 'GDX_High',
       'GDX_Low', 'GDX_Close', 'GDX_Adj Close', 'GDX_Volume', 'USO_Open',
       'USO_High', 'USO_Low', 'USO_Close', 'USO_Adj Close', 'USO_Volume'],
      dtype='object')
Out[1]:
Date Open High Low Close Adj Close Volume SP_open SP_high SP_low ... GDX_Low GDX_Close GDX_Adj Close GDX_Volume USO_Open USO_High USO_Low USO_Close USO_Adj Close USO_Volume
0 2011-12-15 154.740005 154.949997 151.710007 152.330002 152.330002 21521900 123.029999 123.199997 121.989998 ... 51.570000 51.680000 48.973877 20605600 36.900002 36.939999 36.049999 36.130001 36.130001 12616700
1 2011-12-16 154.309998 155.369995 153.899994 155.229996 155.229996 18124300 122.230003 122.949997 121.300003 ... 52.040001 52.680000 49.921513 16285400 36.180000 36.500000 35.730000 36.270000 36.270000 12578800
2 2011-12-19 155.479996 155.860001 154.360001 154.869995 154.869995 12547200 122.059998 122.320000 120.029999 ... 51.029999 51.169998 48.490578 15120200 36.389999 36.450001 35.930000 36.200001 36.200001 7418200
3 2011-12-20 156.820007 157.429993 156.580002 156.979996 156.979996 9136300 122.180000 124.139999 120.370003 ... 52.369999 52.990002 50.215282 11644900 37.299999 37.610001 37.220001 37.560001 37.560001 10041600
4 2011-12-21 156.979996 157.529999 156.130005 157.160004 157.160004 11996100 123.930000 124.360001 122.750000 ... 52.419998 52.959999 50.186852 8724300 37.669998 38.240002 37.520000 38.110001 38.110001 10728000
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1713 2018-12-24 119.570000 120.139999 119.570000 120.019997 120.019997 9736400 239.039993 240.839996 234.270004 ... 20.650000 21.090000 21.090000 60507000 9.490000 9.520000 9.280000 9.290000 9.290000 21598200
1714 2018-12-26 120.620003 121.000000 119.570000 119.660004 119.660004 14293500 235.970001 246.179993 233.759995 ... 20.530001 20.620001 20.620001 76365200 9.250000 9.920000 9.230000 9.900000 9.900000 40978800
1715 2018-12-27 120.570000 120.900002 120.139999 120.570000 120.570000 11874400 242.570007 248.289993 238.960007 ... 20.700001 20.969999 20.969999 52393000 9.590000 9.650000 9.370000 9.620000 9.620000 36578700
1716 2018-12-28 120.800003 121.080002 120.720001 121.059998 121.059998 6864700 249.580002 251.399994 246.449997 ... 20.570000 20.600000 20.600000 49835000 9.540000 9.650000 9.380000 9.530000 9.530000 22803400
1717 2018-12-31 120.980003 121.260002 120.830002 121.250000 121.250000 8449400 249.559998 250.190002 247.470001 ... 20.559999 21.090000 21.090000 53866600 9.630000 9.710000 9.440000 9.660000 9.660000 28417400

1718 rows × 81 columns

1-я бизнес-цель (регрессия):

Предсказание цены на золото с целью принятия инвесторами решения о покупке товаров.

Целевой признак: цена закрытия Adj Close.

Вход: Volume, Hight, Low, Close, Open.
Достижимый уровень качества: предсказания должны иметь погрешность в среднем не более 5$. Для проверки будет использоваться метрика MAE (средняя абсолютная ошибка)

In [ ]:
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.discriminant_analysis import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import roc_auc_score, confusion_matrix, accuracy_score
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
import seaborn as sns
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import mean_squared_error
import numpy as np
from sklearn import metrics
import sklearn.preprocessing as preproc
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.metrics import mean_absolute_error
from mlxtend.evaluate import bias_variance_decomp
from sklearn.neural_network import MLPRegressor

# Загрузка данных
df = pd.read_csv("..//static//csv//FINAL_USO.csv")
data = df['Volume', 'High', 'Open', 'Close', 'Low','Adj Close']

X = data.drop('Adj Close', axis=1)
y = data['Adj Close']

# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Преобразование числовых данных
#заполнение пустых значений медианой
num_imputer = SimpleImputer(strategy="median")

preprocessing_num = Pipeline(
    [
        ("imputer", num_imputer)
    ]
)

#Категориальных данных нет, поэтому преобразовывать их не надо


# Общая предобработка (только числовые данные)
preprocessing = ColumnTransformer(
    [
        ("nums", preprocessing_num, X.columns)
    ]
)

Лнейная регрессия:

In [13]:
pipeline_lin_reg = Pipeline([
    ('preprocessing', preprocessing),
    ('model', LinearRegression())]
)

# Определение сетки гиперпараметров (возможных знач-ий гиперпараметров) для перебора
param_grid = {
    #как будут масштабироваться признаки
    'preprocessing': [StandardScaler(), preproc.MinMaxScaler(), preproc.MaxAbsScaler(), None]
}

# Создание объекта GridSearchCV для поиска лучших гиперпараметров по сетке с максимальным знач-ием 
# отрицательного корня из среднеквадратичной ошибки (отриц., чтобы искался не минимум, а максимум)
grid_search = GridSearchCV(pipeline_lin_reg, param_grid, cv=5, scoring='neg_root_mean_squared_error', n_jobs=-1)

# Обучение модели с перебором гиперпараметров
grid_search.fit(X_train, y_train)

print("Лучшие гиперпараметры: ", grid_search.best_params_)

# Лучшая модель лин. регрессии
best_model = grid_search.best_estimator_

y_pred = best_model.predict(X_test)

print(f'Cредняя абсолютная ошибка (MAE) = {mean_absolute_error(y_test, y_pred)}')


# Оценка дисперсии и смещения
cv_results = grid_search.cv_results_
mean_test_score = cv_results['mean_test_score']
std_test_score = cv_results['std_test_score']

print(f"Смещение: {mean_test_score.mean()}")
print(f"Дисперсия: {std_test_score.mean()}")

from sklearn.metrics import r2_score

print(f'R^2 = {r2_score(y_test, y_pred)}')
Лучшие гиперпараметры:  {'preprocessing': MinMaxScaler()}
Cредняя абсолютная ошибка (MAE) = 1.8424538380756087e-14
Смещение: -5.1553225998619436e-11
Дисперсия: 3.270386026049708e-11
R^2 = 1.0

Гребневая регрессия

In [14]:
pipeline_ridge = Pipeline([
    ('preprocessing', preprocessing),
    ('model', Ridge())]
)

# Определение сетки гиперпараметров (возможных знач-ий гиперпараметров) для перебора
param_grid = {
    #как будут масштабироваться признаки
    'preprocessing': [StandardScaler(), preproc.MinMaxScaler(), preproc.MaxAbsScaler(), None],
    #сила регуляризации
    'model__alpha': [0, 0.5, 1.0, 1.5, 2.0, 5.0, 10.0] 
}

# Создание объекта GridSearchCV для поиска лучших гиперпараметров по сетке с максимальным знач-ием 
# отрицательного корня из среднеквадратичной ошибки (отриц., чтобы искался не минимум, а максимум)
grid_search = GridSearchCV(pipeline_ridge, param_grid, cv=5, scoring='neg_root_mean_squared_error', n_jobs=-1, verbose=0)

# Обучение модели с перебором гиперпараметров
grid_search.fit(X_train, y_train)

print("Лучшие гиперпараметры: ", grid_search.best_params_)

# Лучшая модель регрессии
best_model = grid_search.best_estimator_

y_pred = best_model.predict(X_test)

print(f'Cредняя абсолютная ошибка (MAE) = {mean_absolute_error(y_test, y_pred)}')


cv_results = grid_search.cv_results_
mean_test_score = cv_results['mean_test_score']
std_test_score = cv_results['std_test_score']

print(f"Смещение: {mean_test_score.mean()}")
print(f"Дисперсия: {std_test_score.mean()}")

print(f'R^2 = {r2_score(y_test, y_pred)}')
Лучшие гиперпараметры:  {'model__alpha': 0, 'preprocessing': StandardScaler()}
Cредняя абсолютная ошибка (MAE) = 5.494726121130867e-13
Смещение: -0.4263701358095246
Дисперсия: 0.02072744817291101
R^2 = 1.0

Гребнавая регрессия дала более точные результаты, чем линейная.

Метод градиентного бустинга (набор деревьев решений)

In [19]:
from sklearn.metrics import roc_auc_score, confusion_matrix, accuracy_score
from sklearn.ensemble import GradientBoostingRegressor, RandomForestClassifier, GradientBoostingClassifier
# Конвейер
pipeline_grad = Pipeline([
    ('preprocessing', preprocessing),
    ('model', GradientBoostingRegressor())
])

# Определение сетки гиперпараметров
param_grid = {
    'preprocessing': [StandardScaler(), preproc.MinMaxScaler(), preproc.MaxAbsScaler(), None],
    'model__n_estimators': [100, 200, 300],
    #Скорость обучения
    'model__learning_rate': [0.1, 0.2],
    #Максимальная глубина дерева
    'model__max_depth': [3, 5, 7]
}

# Создание объекта GridSearchCV
grid_search = GridSearchCV(pipeline_grad, param_grid, cv=2, scoring='neg_root_mean_squared_error', n_jobs=-1)

# Обучение модели с перебором гиперпараметров
grid_search.fit(X_train, y_train)

print("Лучшие гиперпараметры: ", grid_search.best_params_)

# Лучшая модель случайного леса
best_model = grid_search.best_estimator_


y_pred = best_model.predict(X_test)


print(f'Cредняя абсолютная ошибка (MAE) = {mean_absolute_error(y_test, y_pred)}')


# Получение предсказаний на кросс-валидации
y_cv_pred = cross_val_predict(best_model, X_train, y_train, cv=3)

cv_results = grid_search.cv_results_
mean_test_score = cv_results['mean_test_score']
std_test_score = cv_results['std_test_score']

print(f"Смещение: {mean_test_score.mean()}")
print(f"Дисперсия: {std_test_score.mean()}")

print(f'R^2 = {r2_score(y_test, y_pred)}')
Лучшие гиперпараметры:  {'model__learning_rate': 0.1, 'model__max_depth': 5, 'model__n_estimators': 300, 'preprocessing': None}
Cредняя абсолютная ошибка (MAE) = 0.040833243038698064
Смещение: -0.2177327926836486
Дисперсия: 0.021373424060567556
R^2 = 0.9999842165416633

Вывод:

Все 3 модели регрессии показали допустимый уровень "погрешности".

R² (коэффициент детерминации): 0.99 — это очень высокий уровень, указывающий на то, что модель объясняет 99% вариации целевой переменной. Это свидетельствует о высокой предсказательной способности модели.

Из всех моделей градиентный бустинг показал самую низкую "погрешность".

2-я бизнес-цель (классификация):

Определить оптимальные коэффициенты для различных факторов, влияющих на цену золота.

Целевой признак: Adj Close.

Вход: Volume, Hight, Low, Close, Open.

In [ ]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, ConfusionMatrixDisplay

# Загружаем набор данных
df = pd.read_csv("..//static//csv//FINAL_USO.csv")

numerical_cols = ['Volume', 'High', 'Open', 'Close', 'Low']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numerical_cols)
    ])

# Список моделей и их гиперпараметров для задачи регрессии
models_reg = {
    "Linear Regression": (LinearRegression(), {}),
    "Random Forest Regression": (RandomForestRegressor(), {
        'model__n_estimators': [100, 200],
        'model__max_depth': [None, 10, 20]
    }),
    "Gradient Boosting Regression": (GradientBoostingRegressor(), {
        'model__n_estimators': [100, 200],
        'model__learning_rate': [0.01, 0.1],
        'model__max_depth': [3, 5]
    })
}

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df[numerical_cols]
y_reg = df['Adj Close']

# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)

# Список моделей и их гиперпараметров для задачи классификации
models_class = {
    "Logistic Regression": (LogisticRegression(), {
        'model__C': [0.1, 1, 10],
        'model__solver': ['liblinear', 'lbfgs']
    }),
    "Random Forest Classification": (RandomForestClassifier(), {
        'model__n_estimators': [100, 200],
        'model__max_depth': [None, 10, 20]
    }),
    "Gradient Boosting Classification": (GradientBoostingClassifier(), {
        'model__n_estimators': [100, 200],
        'model__learning_rate': [0.01, 0.1],
        'model__max_depth': [3, 5]
    })
}

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[ numerical_cols]
y_class = (df['Adj Close'] > df['Adj Close'].mean()).astype(int)

# Разделяем данные на обучающую и тестовую выборки для задачи классификации
X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(X_class, y_class, test_size=0.2, random_state=42)

# Обучаем и оцениваем модели для задачи классификации
print("Результаты для задачи классификации:")
for name, (model, params) in models_class.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')
    grid_search.fit(X_train_class, y_train_class)
    best_model = grid_search.best_estimator_
    y_pred_class = best_model.predict(X_test_class)
    accuracy = accuracy_score(y_test_class, y_pred_class)
    precision = precision_score(y_test_class, y_pred_class)
    recall = recall_score(y_test_class, y_pred_class)
    f1 = f1_score(y_test_class, y_pred_class)
    print(f"Model: {name}")
    print(f"Best Parameters: {grid_search.best_params_}")
    print(f"Accuracy: {accuracy}")
    print(f"Precision: {precision}")
    print(f"Recall: {recall}")
    print(f"F1-score: {f1}")
    print()

    # Визуализация матрицы ошибок
    cm = confusion_matrix(y_test_class, y_pred_class)
    disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Less', 'More'])
    disp.plot(cmap=plt.cm.Blues)
    plt.title(f'Confusion Matrix for {name}')
    plt.show()
Результаты для задачи классификации:
Model: Logistic Regression
Best Parameters: {'model__C': 10, 'model__solver': 'liblinear'}
Accuracy: 0.9825581395348837
Precision: 1.0
Recall: 0.9469026548672567
F1-score: 0.9727272727272728

No description has been provided for this image
Model: Random Forest Classification
Best Parameters: {'model__max_depth': None, 'model__n_estimators': 100}
Accuracy: 1.0
Precision: 1.0
Recall: 1.0
F1-score: 1.0

No description has been provided for this image
Model: Gradient Boosting Classification
Best Parameters: {'model__learning_rate': 0.01, 'model__max_depth': 3, 'model__n_estimators': 100}
Accuracy: 1.0
Precision: 1.0
Recall: 1.0
F1-score: 1.0

No description has been provided for this image

Вывод:

Градиентный бустинг и случайный лес выдали наилучшие результаты.

Давайте проанализируем полученные значения метрик и определим, являются ли они нормальными или их можно улучшить.

Оценка смещения и дисперсии для задачи регрессии:

Вывод для задачи регрессии:

  • Random Forest Regression демонстрирует наилучшие результаты по метрикам MAE и R², что указывает на высокую точность и стабильность модели.
  • Linear Regression и Gradient Boosting Regression также показывают хорошие результаты, но уступают случайному лесу.

Вывод для задачи классификации:

  • Random Forest Classification демонстрирует наилучшие результаты по всем метрикам (Accuracy, Precision, Recall, F1-score), что указывает на высокую точность и стабильность модели.
  • Logistic Regression и Gradient Boosting Classification также показывают хорошие результаты, но уступают случайному лесу.

Для оценки смещения (bias) и дисперсии (variance) моделей можно использовать метод перекрестной проверки (cross-validation). Этот метод позволяет оценить, насколько хорошо модель обобщается на новых данных.

Оценка смещения и дисперсии для задачи регрессии: Для задачи регрессии мы будем использовать метрики MAE (Mean Absolute Error) и R² (R-squared) для оценки смещения и дисперсии.

Оценка смещения и дисперсии для задачи классификации: Для задачи классификации мы будем использовать метрики Accuracy, Precision, Recall и F1-score для оценки смещения и дисперсии.

Пример кода для оценки смещения и дисперсии:

In [ ]:
import pandas as pd
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

# Загружаем набор данных
df = pd.read_csv("..//static//csv//FINAL_USO.csv")

# Определяем категориальные и числовые столбцы
numerical_cols = ['Volume', 'High', 'Open', 'Close', 'Low']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numerical_cols)
    ])

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df[numerical_cols]
y_reg = df['Adj Close']

# Список моделей для задачи регрессии
models_reg = {
    "Linear Regression": LinearRegression(),
    "Random Forest Regression": RandomForestRegressor(),
    "Gradient Boosting Regression": GradientBoostingRegressor()
}

# Оценка смещения и дисперсии для задачи регрессии
print("Оценка смещения и дисперсии для задачи регрессии:")
for name, model in models_reg.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')
    r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')
    print(f"Model: {name}")
    print(f"MAE (Cross-Validation): Mean = {mae_scores.mean()}, Std = {mae_scores.std()}")
    print(f"R² (Cross-Validation): Mean = {r2_scores.mean()}, Std = {r2_scores.std()}")
    print()

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[numerical_cols]
y_class = (df['Adj Close'] > df['Adj Close'].mean()).astype(int)

# Список моделей для задачи классификации
models_class = {
    "Logistic Regression": LogisticRegression(),
    "Random Forest Classification": RandomForestClassifier(),
    "Gradient Boosting Classification": GradientBoostingClassifier()
}

# Оценка смещения и дисперсии для задачи классификации
print("Оценка смещения и дисперсии для задачи классификации:")
for name, model in models_class.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')
    precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')
    recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')
    f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')
    print(f"Model: {name}")
    print(f"Accuracy (Cross-Validation): Mean = {accuracy_scores.mean()}, Std = {accuracy_scores.std()}")
    print(f"Precision (Cross-Validation): Mean = {precision_scores.mean()}, Std = {precision_scores.std()}")
    print(f"Recall (Cross-Validation): Mean = {recall_scores.mean()}, Std = {recall_scores.std()}")
    print(f"F1-score (Cross-Validation): Mean = {f1_scores.mean()}, Std = {f1_scores.std()}")
    print()
Оценка смещения и дисперсии для задачи регрессии:
Model: Linear Regression
MAE (Cross-Validation): Mean = 3.475420657900542e-14, Std = 2.3108544967235046e-14
R² (Cross-Validation): Mean = 1.0, Std = 0.0

Model: Random Forest Regression
MAE (Cross-Validation): Mean = 4.770713368258853, Std = 9.027907502951276
R² (Cross-Validation): Mean = -0.8676362010013315, Std = 3.6735082182967664

Model: Gradient Boosting Regression
MAE (Cross-Validation): Mean = 4.790726208613611, Std = 8.978223486805094
R² (Cross-Validation): Mean = -0.8531326799804774, Std = 3.6480201756306525

Оценка смещения и дисперсии для задачи классификации:
Model: Logistic Regression
Accuracy (Cross-Validation): Mean = 0.9469472506610617, Std = 0.09607008028935687
Precision (Cross-Validation): Mean = 0.9903846153846153, Std = 0.019230769230769253
Recall (Cross-Validation): Mean = 0.8244897959183675, Std = 0.34090796763789555
F1-score (Cross-Validation): Mean = 0.8430120359555126, Std = 0.29664350339720796

Model: Random Forest Classification
Accuracy (Cross-Validation): Mean = 0.99533527696793, Std = 0.009329446064139945
Precision (Cross-Validation): Mean = 1.0, Std = 0.0
Recall (Cross-Validation): Mean = 0.9795918367346939, Std = 0.04081632653061225
F1-score (Cross-Validation): Mean = 0.9904843365764995, Std = 0.016633019819396317

Model: Gradient Boosting Classification
Accuracy (Cross-Validation): Mean = 0.9988338192419824, Std = 0.0023323615160349754
Precision (Cross-Validation): Mean = 1.0, Std = 0.0
Recall (Cross-Validation): Mean = 0.9959183673469388, Std = 0.008163265306122458
F1-score (Cross-Validation): Mean = 0.9979381443298969, Std = 0.004123711340206171

In [13]:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

# Загружаем набор данных
df = pd.read_csv("..//static//csv//FINAL_USO.csv")

# Определяем категориальные и числовые столбцы
numerical_cols = ['Volume', 'High', 'Open', 'Close', 'Low']

# Создаем преобразователь для категориальных и числовых столбцов
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numerical_cols)
    ])

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df[ numerical_cols]
y_reg = df['Adj Close']

# Список моделей для задачи регрессии
models_reg = {
    "Linear Regression": LinearRegression(),
    "Random Forest Regression": RandomForestRegressor(),
    "Gradient Boosting Regression": GradientBoostingRegressor()
}

# Оценка смещения и дисперсии для задачи регрессии
mae_means = []
mae_stds = []
r2_means = []
r2_stds = []

for name, model in models_reg.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    mae_scores = -cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='neg_mean_absolute_error')
    r2_scores = cross_val_score(pipeline, X_reg, y_reg, cv=5, scoring='r2')
    mae_means.append(mae_scores.mean())
    mae_stds.append(mae_scores.std())
    r2_means.append(r2_scores.mean())
    r2_stds.append(r2_scores.std())

# Визуализация результатов для задачи регрессии
fig, ax = plt.subplots(1, 2, figsize=(15, 6))

ax[0].bar(models_reg.keys(), mae_means, yerr=mae_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[0].set_ylabel('MAE')
ax[0].set_title('Mean Absolute Error (MAE) for Regression Models')
ax[0].yaxis.grid(True)

ax[1].bar(models_reg.keys(), r2_means, yerr=r2_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[1].set_ylabel('R²')
ax[1].set_title('R-squared (R²) for Regression Models')
ax[1].yaxis.grid(True)

plt.tight_layout()
plt.show()

# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
X_class = df[numerical_cols]
y_class = (df['Adj Close'] > df['Adj Close'].mean()).astype(int)

# Список моделей для задачи классификации
models_class = {
    "Logistic Regression": LogisticRegression(),
    "Random Forest Classification": RandomForestClassifier(),
    "Gradient Boosting Classification": GradientBoostingClassifier()
}

# Оценка смещения и дисперсии для задачи классификации
accuracy_means = []
accuracy_stds = []
precision_means = []
precision_stds = []
recall_means = []
recall_stds = []
f1_means = []
f1_stds = []

for name, model in models_class.items():
    pipeline = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('model', model)
    ])
    accuracy_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='accuracy')
    precision_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='precision')
    recall_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='recall')
    f1_scores = cross_val_score(pipeline, X_class, y_class, cv=5, scoring='f1')
    accuracy_means.append(accuracy_scores.mean())
    accuracy_stds.append(accuracy_scores.std())
    precision_means.append(precision_scores.mean())
    precision_stds.append(precision_scores.std())
    recall_means.append(recall_scores.mean())
    recall_stds.append(recall_scores.std())
    f1_means.append(f1_scores.mean())
    f1_stds.append(f1_scores.std())

# Визуализация результатов для задачи классификации
fig, ax = plt.subplots(2, 2, figsize=(17, 12))

ax[0, 0].bar(models_class.keys(), accuracy_means, yerr=accuracy_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[0, 0].set_ylabel('Accuracy')
ax[0, 0].set_title('Accuracy for Classification Models')
ax[0, 0].yaxis.grid(True)

ax[0, 1].bar(models_class.keys(), precision_means, yerr=precision_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[0, 1].set_ylabel('Precision')
ax[0, 1].set_title('Precision for Classification Models')
ax[0, 1].yaxis.grid(True)

ax[1, 0].bar(models_class.keys(), recall_means, yerr=recall_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[1, 0].set_ylabel('Recall')
ax[1, 0].set_title('Recall for Classification Models')
ax[1, 0].yaxis.grid(True)

ax[1, 1].bar(models_class.keys(), f1_means, yerr=f1_stds, align='center', alpha=0.5, ecolor='black', capsize=10)
ax[1, 1].set_ylabel('F1-score')
ax[1, 1].set_title('F1-score for Classification Models')
ax[1, 1].yaxis.grid(True)

plt.tight_layout()
plt.show()
No description has been provided for this image
No description has been provided for this image