Merge pull request 'simonov_nikita_lab5' (#214) from simonov_nikita_lab_5 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/214
This commit is contained in:
commit
3aab7834b9
63
simonov_nikita_lab_5/lab5.py
Normal file
63
simonov_nikita_lab_5/lab5.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import pandas as pd
|
||||||
|
from sklearn.linear_model import LinearRegression
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
from sklearn.metrics import r2_score, mean_squared_error
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
import math
|
||||||
|
from sklearn.impute import SimpleImputer
|
||||||
|
|
||||||
|
# Загрузка данных
|
||||||
|
df = pd.read_csv('train_bikes.csv').dropna()
|
||||||
|
|
||||||
|
# Определение признаков (X) и целевой переменной (y)
|
||||||
|
X = df[['humidity', 'windspeed']]
|
||||||
|
y = df['count']
|
||||||
|
|
||||||
|
# Обработка пропущенных значений с использованием SimpleImputer
|
||||||
|
imputer = SimpleImputer(strategy='mean')
|
||||||
|
X = imputer.fit_transform(X)
|
||||||
|
|
||||||
|
# Разделение данных на обучающий, валидационный и тестовый наборы
|
||||||
|
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=0)
|
||||||
|
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=0)
|
||||||
|
|
||||||
|
# Создание и обучение модели линейной регрессии
|
||||||
|
linear_model = LinearRegression()
|
||||||
|
linear_model.fit(X_train, y_train)
|
||||||
|
|
||||||
|
# Вывод коэффициентов и пересечения
|
||||||
|
print(f'Коэффициенты линейной регрессии: {linear_model.coef_}')
|
||||||
|
print(f'Пересечение линейной регрессии: {linear_model.intercept_}')
|
||||||
|
|
||||||
|
# Предсказание значений на тестовом наборе
|
||||||
|
y_pred = linear_model.predict(X_test)
|
||||||
|
|
||||||
|
# Оценка модели
|
||||||
|
train_score = linear_model.score(X_train, y_train)
|
||||||
|
val_score = linear_model.score(X_val, y_val)
|
||||||
|
test_score = linear_model.score(X_test, y_test)
|
||||||
|
|
||||||
|
print(f'R^2 на обучающем наборе: {train_score}')
|
||||||
|
print(f'R^2 на валидационном наборе: {val_score}')
|
||||||
|
print(f'R^2 на тестовом наборе: {test_score}')
|
||||||
|
|
||||||
|
# Оценка качества предсказаний
|
||||||
|
MSE = mean_squared_error(y_test, y_pred)
|
||||||
|
RMSE = math.sqrt(MSE)
|
||||||
|
print(f'Среднеквадратичная ошибка: {MSE}')
|
||||||
|
print(f'Корень из среднеквадратичной ошибки: {RMSE}')
|
||||||
|
|
||||||
|
# Применение стиля графика
|
||||||
|
plt.style.use(['dark_background'])
|
||||||
|
|
||||||
|
# Визуализация предсказаний
|
||||||
|
plt.figure(figsize=(8, 6), dpi=80)
|
||||||
|
plt.scatter(y_test, y_pred, alpha=0.2, color='red')
|
||||||
|
m, b = np.polyfit(y_test, y_pred, 1)
|
||||||
|
plt.plot(y_test, m * y_test + b, color='yellow')
|
||||||
|
plt.xlabel('Фактическое значение (тестовый набор)', fontsize=14)
|
||||||
|
plt.ylabel('Предсказанное значение (тестовый набор)', fontsize=14)
|
||||||
|
plt.title('Линейная регрессия: предсказанные и фактические значения (тестовый набор)', fontsize=16)
|
||||||
|
plt.grid(linewidth=0.5)
|
||||||
|
plt.show()
|
134
simonov_nikita_lab_5/readme.md
Normal file
134
simonov_nikita_lab_5/readme.md
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
# Лабораторная работа №5 Вариант 25.
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
Общее задание: Использовать линейную регрессию, самостоятельно сформулировав задачу.
|
||||||
|
|
||||||
|
Задача регрессии: Как влажность (Humidity) и скорость ветра (windspeed) влияют на количество арендованных велосипедов?
|
||||||
|
|
||||||
|
Ссылка на набор даных: [kaggle-bike-sharing-system](https://www.kaggle.com/datasets/itssuru/bike-sharing-system-washington-dc/?select=train_bikes.csv)
|
||||||
|
|
||||||
|
## Содержание
|
||||||
|
- [Лабораторная работа №5 Вариант 25.](#лабораторная-работа-5-вариант-25)
|
||||||
|
- [Задание](#задание)
|
||||||
|
- [Содержание](#содержание)
|
||||||
|
- [Введение](#введение)
|
||||||
|
- [Зависимости](#зависимости)
|
||||||
|
- [Запуск приложения](#запуск-приложения)
|
||||||
|
- [Описание кода](#описание-кода)
|
||||||
|
- [Заключение](#заключение)
|
||||||
|
- [Оценка работы моделей](#оценка-работы-моделей)
|
||||||
|
- [На основе анализа можно сделать следующие выводы:](#на-основе-анализа-можно-сделать-следующие-выводы)
|
||||||
|
- [Общий вывод](#общий-вывод)
|
||||||
|
|
||||||
|
## Введение
|
||||||
|
|
||||||
|
Данный код демонстрирует, использование линейной регрессии для анализа влияния влажности (humidity) и скорости ветра (windspeed) на количество арендованных велосипедов.
|
||||||
|
|
||||||
|
## Зависимости
|
||||||
|
|
||||||
|
Для работы этого приложения необходимы следующие библиотеки Python:
|
||||||
|
|
||||||
|
- pandas
|
||||||
|
- scikit-learn
|
||||||
|
- NumPy
|
||||||
|
- Matplotlib
|
||||||
|
|
||||||
|
Вы можете установить их с помощью pip:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install numpy scikit-learn pandas matplotlib
|
||||||
|
```
|
||||||
|
|
||||||
|
## Запуск приложения
|
||||||
|
|
||||||
|
Чтобы запустить эту программу, выполните следующую команду:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python lab5.py
|
||||||
|
```
|
||||||
|
Откроется визуализация данных и в консоль выведется резудьтат.
|
||||||
|
|
||||||
|
## Описание кода
|
||||||
|
|
||||||
|
- Используется библиотека `pandas` для чтения данных из файла `train_bikes.csv`, пропущенные значения удаляются из набора данных.
|
||||||
|
|
||||||
|
- Выделяются признаки `humidity` и `windspeed` и целевая переменная `count`.
|
||||||
|
|
||||||
|
- Используется `SimpleImputer` для замены пропущенных значений средними значениями.
|
||||||
|
|
||||||
|
- Данные разделяются на обучающий, валидационный и тестовый наборы с использованием `train_test_split`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=0)
|
||||||
|
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=0)
|
||||||
|
```
|
||||||
|
|
||||||
|
- Инициализируется и обучается модель линейной регрессии на обучающем наборе.
|
||||||
|
|
||||||
|
```python
|
||||||
|
linear_model = LinearRegression()
|
||||||
|
linear_model.fit(X_train, y_train)
|
||||||
|
```
|
||||||
|
|
||||||
|
- Выводятся коэффициенты и пересечение линейной регрессии.
|
||||||
|
|
||||||
|
```python
|
||||||
|
print(f'Коэффициенты линейной регрессии: {linear_model.coef_}')
|
||||||
|
print(f'Пересечение линейной регрессии: {linear_model.intercept_}')
|
||||||
|
```
|
||||||
|
|
||||||
|
- Модель применяется для предсказания значений на тестовом наборе.
|
||||||
|
|
||||||
|
```python
|
||||||
|
y_pred = linear_model.predict(X_test)
|
||||||
|
```
|
||||||
|
|
||||||
|
- Вычисляются R^2 на обучающем, валидационном и тестовом наборах. Вычисляется среднеквадратичная ошибка (MSE) и корень из среднеквадратичной ошибки (RMSE).
|
||||||
|
|
||||||
|
```python
|
||||||
|
train_score = linear_model.score(X_train, y_train)
|
||||||
|
val_score = linear_model.score(X_val, y_val)
|
||||||
|
test_score = linear_model.score(X_test, y_test)
|
||||||
|
|
||||||
|
MSE = mean_squared_error(y_test, y_pred)
|
||||||
|
RMSE = math.sqrt(MSE)
|
||||||
|
```
|
||||||
|
|
||||||
|
- Визуализация предсказаний
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
### Оценка работы моделей
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Коэффициенты линейной регрессии: [-2.89204789 0.09562289]
|
||||||
|
Пересечение линейной регрессии: 368.16350038517544
|
||||||
|
R^2 на обучающем наборе: 0.09485704260674943
|
||||||
|
R^2 на валидационном наборе: 0.11424344387927587
|
||||||
|
R^2 на тестовом наборе: 0.10376993874162632
|
||||||
|
Среднеквадратичная ошибка: 28561.64598031308
|
||||||
|
Корень из среднеквадратичной ошибки: 169.00191117355175
|
||||||
|
```
|
||||||
|
|
||||||
|
![](result.png)
|
||||||
|
|
||||||
|
### На основе анализа можно сделать следующие выводы:
|
||||||
|
|
||||||
|
1. Коэффициенты линейной регрессии:
|
||||||
|
|
||||||
|
- Влажность (humidity): Отрицательный коэффициент говорит о том, что уменьшение количества арендованных велосипедов связано с увеличением влажности.
|
||||||
|
- Скорость ветра (windspeed): Положительный коэффициент указывает на то, что увеличение количества арендованных велосипедов связано с увеличение скорости ветра. Однако, этот эффект малозначителен.
|
||||||
|
|
||||||
|
1. Оценка модели:
|
||||||
|
|
||||||
|
- R^2 (Коэффициент детерминации): Низкие значения R^2 (около 0.1) свидетельствуют о том, что выбранные признаки слабо объясняют изменение целевой переменной.
|
||||||
|
- Среднеквадратичная ошибка (MSE): Высокое значение MSE (28561.65) указывает на значительное расхождение между фактическими и предсказанными значениями.
|
||||||
|
|
||||||
|
3. Визуализация:
|
||||||
|
|
||||||
|
- График предсказанных и фактических значений показывает, что модель не идеально подходит под данные. Разброс предсказаний велик.
|
||||||
|
|
||||||
|
### Общий вывод
|
||||||
|
|
||||||
|
Модель линейной регрессии, основанная на влажности и скорости ветра, демонстрирует невысокую объясняющую способность (низкие значения R^2) и высокую среднеквадратичную ошибку. Это может свидетельствовать о том, что выбранные признаки недостаточно хорошо описывают зависимость от целевой переменной (количества арендованных велосипедов). Возможно, для более точного предсказания следует рассмотреть другие признаки или использовать более сложные модели.
|
BIN
simonov_nikita_lab_5/result.png
Normal file
BIN
simonov_nikita_lab_5/result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 104 KiB |
10887
simonov_nikita_lab_5/train_bikes.csv
Normal file
10887
simonov_nikita_lab_5/train_bikes.csv
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user