79 KiB
Начало лабораторной работы¶
import pandas as pd
df1 = pd.read_csv("..//static//csv//mobile phone price prediction.csv")
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")
print(df1.columns)
print(df.columns)
Бизнес-цели:¶
- Прогнозирование цен на мобильные телефоны:
Цель: Разработать точную модель машинного обучения для прогнозирования цен на мобильные телефоны на основе характеристик.
Применение: Оптимизация ценообразования для производителей и продавцов. Помощь потребителям в принятии обоснованных решений при покупке.
- Оптимизация характеристик продукта:
Цель: Определить оптимальный набор характеристик для мобильных телефонов, максимизирующий ценность для потребителей при заданном бюджете.
Применение: Разработка новых моделей мобильных телефонов. Улучшение существующих моделей.
1. Прогнозирование цен на мобильные телефоны¶
import pandas as pd
# Загружаем набор данных
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")
# Удаление пустого столбца по имени
df = df.drop('Unnamed: 0', axis=1)
# Устанавливаем случайное состояние
random_state = 42
# Рассчитываем среднее значение цены
average_price = df['Price'].mean()
print(f"Среднее значение поля 'Price': {average_price}")
# Создаем новую переменную, указывающую, превышает ли цена среднюю
df['above_average_price'] = (df['Price'] > average_price).astype(int)
# Рассчитываем волатильность (разницу между максимальной и минимальной ценой)
df['price_volatility'] = df['Price'].max() - df['Price'].min()
# Выводим первые строки измененной таблицы для проверки
print(df.head(20))
2. Оптимизация характеристик продукта¶
import pandas as pd
# Загружаем набор данных
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")
# Удаление пустого столбца по имени
df = df.drop('Unnamed: 0', axis=1)
# Устанавливаем случайное состояние
random_state = 42
# Рассчитываем среднюю цену для каждого значения каждого признака (Model уберем, у всех разная)
for column in ['Brand', 'Battery capacity (mAh)', 'Screen size (inches)', 'Touchscreen',
'Resolution x', 'Resolution y', 'Processor', 'RAM (MB)', 'Internal storage (GB)',
'Rear camera', 'Front camera', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS',
'Number of SIMs', '3G', '4G/ LTE']:
print(f"Средняя цена для '{column}':")
print(df.groupby(column)['Price'].mean())
print()
# Рассчитываем среднюю цену для комбинаций признаков
# для комбинации 'Brand' и 'Operating system'
print("Средняя цена для комбинации 'Brand' и 'Operating system':")
print(df.groupby(['Brand', 'Operating system'])['Price'].mean())
print()
# Рассчитываем среднюю цену для комбинации 'RAM (MB)' и 'Internal storage (GB)'
print("Средняя цена для комбинации 'RAM (MB)' и 'Internal storage (GB)':")
print(df.groupby(['RAM (MB)', 'Internal storage (GB)'])['Price'].mean())
print()
# Рассчитываем среднюю цену для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)'
print("Средняя цена для комбинации 'Screen size (inches)' и 'Battery capacity (mAh)':")
print(df.groupby(['Screen size (inches)', 'Battery capacity (mAh)'])['Price'].mean())
print()
Выбор ориентира для каждой задачи:¶
- Прогнозирование цен на мобильные телефоны: Ориентир:
R² (коэффициент детерминации): 0.75 - 0.85
MAE (средняя абсолютная ошибка): 5000 - 10000 рублей
RMSE (среднеквадратичная ошибка): 10000 - 20000 рублей
Объяснение:
R²: Значение 0.75 - 0.85 будет означать, что модель объясняет 75-85% вариации цен на мобильные телефоны, что является хорошим результатом для задачи регрессии.
MAE: Значение 5000 - 10000 рублей будет означать, что в среднем модель ошибается на 5000 - 10000 рублей при прогнозировании цен на мобильные телефоны. Учитывая диапазон цен от 9000 до 150000 рублей, этот ориентир является разумным.
RMSE: Значение 10000 - 20000 рублей будет означать, что среднеквадратичная ошибка модели составляет 10000 - 20000 рублей.
- Оптимизация характеристик продукта: Ориентир:
Увеличение прибыли компании: 5% - 10%
Сохранение конкурентоспособных тарифов:
Средняя цена мобильных телефонов не должна увеличиваться более чем на 5% по сравнению с текущими тарифами.
Доля клиентов, считающих цены высокими, не должна увеличиваться более чем на 2%.
Объяснение:
Увеличение прибыли компании:
Цель оптимизации характеристик продукта - максимизировать прибыль компании. Ориентир в 5% - 10% увеличения прибыли является реалистичным и достижимым.
Сохранение конкурентоспособных тарифов:
Важно, чтобы оптимизация характеристик продукта не привела к значительному увеличению цен для клиентов. Ориентир в 5% увеличения средней цены мобильных телефонов и 2% увеличения доли клиентов, считающих цены высокими, позволяет сохранить конкурентоспособность компании.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# Загружаем набор данных
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")
# Удаление пустого столбца по имени
df = df.drop('Unnamed: 0', axis=1)
# Преобразуем категориальные переменные в числовые
df = pd.get_dummies(df, columns=['Name', 'Brand', 'Model', 'Touchscreen', 'Operating system', 'Wi-Fi', 'Bluetooth', 'GPS', '3G', '4G/ LTE'], drop_first=True)
# Разделяем данные на признаки (X) и целевую переменную (y)
X = df.drop('Price', axis=1)
y = df['Price']
# Разделяем данные на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Стандартизируем признаки
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Обучаем модель линейной регрессии
model = LinearRegression()
model.fit(X_train, y_train)
# Делаем предсказания на тестовой выборке
y_pred = model.predict(X_test)
# Оцениваем качество модели
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = mean_squared_error(y_test, y_pred, squared=False)
r2 = r2_score(y_test, y_pred)
print(f"MAE: {mae}")
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"R²: {r2}")
# Проверяем, достигнуты ли ориентиры
if r2 >= 0.75 and mae <= 10000 and rmse <= 20000:
print("Ориентиры для прогнозирования цены мобильных устройств достигнуты!")
else:
print("Ориентиры для прогнозирования цены мобильных устройств не достигнуты.")
# Оптимизация тарифной сетки
# Убедитесь, что столбцы существуют
columns_to_group = ['Battery capacity (mAh)', 'Screen size (inches)', 'RAM (MB)', 'Internal storage (GB)', 'Rear camera', 'Front camera']
# Рассчитываем среднюю цену для каждого значения каждого признака
for column in columns_to_group:
print(f"Средняя цена для '{column}':")
print(df.groupby(column)['Price'].mean())
print()
# Рассчитываем среднюю цену для комбинаций признаков
# Например, для комбинации 'Battery capacity (mAh)' и 'RAM (MB)'
print("Средняя цена для комбинации 'Battery capacity (mAh)' и 'RAM (MB)':")
print(df.groupby(['Battery capacity (mAh)', 'RAM (MB)'])['Price'].mean())
print()
# Рассчитываем среднюю цену для комбинации 'Screen size (inches)' и 'Internal storage (GB)'
print("Средняя цена для комбинации 'Screen size (inches)' и 'Internal storage (GB)':")
print(df.groupby(['Screen size (inches)', 'Internal storage (GB)'])['Price'].mean())
print()
# Рассчитываем среднюю цену для комбинации 'Rear camera' и 'Front camera'
print("Средняя цена для комбинации 'Rear camera' и 'Front camera':")
print(df.groupby(['Rear camera', 'Front camera'])['Price'].mean())
print()
Анализ применимости алгоритмов обучения с учителем для решения поставленных задач:¶
- Прогнозирование стоимости страховых взносов: Задача: Регрессия
Свойства алгоритмов:
Линейная регрессия: Применимость: Хорошо подходит для задач, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.
Деревья решений (регрессия): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.
Случайный лес (регрессия): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.
Градиентный бустинг (регрессия): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.
Нейронные сети (регрессия): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.
Вывод:¶
Линейная регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.
Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.
Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.
Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.
- Оптимизация тарифной сетки: Задача: Классификация (группировка клиентов по группам риска)
Свойства алгоритмов:
Логистическая регрессия: Применимость: Хорошо подходит для задач бинарной классификации, где зависимость между признаками и целевой переменной линейна. Преимущества: Проста в реализации, интерпретируема. Недостатки: Может плохо работать, если зависимость нелинейна.
Деревья решений (классификация): Применимость: Подходит для задач с нелинейными зависимостями. Преимущества: Может обрабатывать категориальные признаки, не требует масштабирования данных. Недостатки: Подвержены переобучению, могут давать нестабильные результаты.
Случайный лес (классификация): Применимость: Хорошо подходит для задач с нелинейными зависимостями и большим количеством признаков. Преимущества: Устойчив к переобучению, может обрабатывать категориальные признаки. Недостатки: Менее интерпретируем, чем линейная регрессия.
Градиентный бустинг (классификация): Применимость: Подходит для задач с нелинейными зависимостями и сложными взаимосвязями между признаками. Преимущества: Может достигать высокой точности, устойчив к переобучению. Недостатки: Сложнее в настройке, чем случайный лес, менее интерпретируем.
Нейронные сети (классификация): Применимость: Подходит для задач с очень сложными зависимостями и большим количеством данных. Преимущества: Может моделировать очень сложные зависимости. Недостатки: Требует большого количества данных, сложнее в настройке и интерпретации.
Вывод:¶
Логистическая регрессия: Может быть хорошим выбором для начала, особенно если зависимость между признаками и целевой переменной линейна.
Деревья решений и случайный лес: Подходят для задач с нелинейными зависимостями.
Градиентный бустинг: Может давать более высокую точность, чем случайный лес, но требует больше времени на настройку.
Нейронные сети: Могут быть излишними для этой задачи, если данных недостаточно много.
- Прогнозирование стоимости страховых взносов: Выбранные модели:
Линейная регрессия
Случайный лес (регрессия)
Градиентный бустинг (регрессия)
- Оптимизация тарифной сетки: Выбранные модели:
Логистическая регрессия
Случайный лес (классификация)
Градиентный бустинг (классификация)
import pandas as pd
from sklearn.model_selection import train_test_split
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.metrics import mean_absolute_error, mean_squared_error, r2_score, accuracy_score
import re
# Загружаем набор данных
df = pd.read_csv("..//static//csv//ndtv_data_final.csv")
# Удаление пустого столбца по имени
df = df.drop('Unnamed: 0', axis=1)
# Извлечение числовых значений из столбца Battery
df['Battery'] = df['Battery'].apply(lambda x: int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else None)
df['Ram'] = df['Ram'].apply(lambda x: int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else None)
df['Camera'] = df['Camera'].apply(lambda x: int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else None)
df['Display'] = df['Display'].apply(lambda x: int(re.search(r'\d+', x).group()) if re.search(r'\d+', x) else None)
# Преобразуем категориальные переменные в числовые
# Предположим, что 'company' и 'Processor_name' являются категориальными
df = pd.get_dummies(df, columns=['company', 'Processor_name'], drop_first=True)
# Разделяем данные на признаки (X) и целевую переменную (y) для задачи регрессии
X_reg = df.drop('Price', axis=1)
y_reg = df['Price']
# Разделяем данные на обучающую и тестовую выборки для задачи регрессии
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)
# Стандартизируем признаки для задачи регрессии
scaler_reg = StandardScaler()
X_train_reg = scaler_reg.fit_transform(X_train_reg)
X_test_reg = scaler_reg.transform(X_test_reg)
# Список моделей для задачи регрессии
models_reg = {
"Linear Regression": LinearRegression(),
"Random Forest Regression": RandomForestRegressor(),
"Gradient Boosting Regression": GradientBoostingRegressor()
}
# Обучаем и оцениваем модели для задачи регрессии
print("Результаты для задачи регрессии:")
for name, model in models_reg.items():
model.fit(X_train_reg, y_train_reg)
y_pred_reg = model.predict(X_test_reg)
mae = mean_absolute_error(y_test_reg, y_pred_reg)
mse = mean_squared_error(y_test_reg, y_pred_reg)
rmse = mean_squared_error(y_test_reg, y_pred_reg, squared=False)
r2 = r2_score(y_test_reg, y_pred_reg)
print(f"Model: {name}")
print(f"MAE: {mae}")
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"R²: {r2}")
print()
# Разделяем данные на признаки (X) и целевую переменную (y) для задачи классификации
# Предположим, что мы классифицируем устройства по рейтингу выше среднего
X_class = df.drop('Rating', axis=1)
y_class = (df['Rating'] > df['Rating'].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)
# Стандартизируем признаки для задачи классификации
scaler_class = StandardScaler()
X_train_class = scaler_class.fit_transform(X_train_class)
X_test_class = scaler_class.transform(X_test_class)
# Список моделей для задачи классификации
models_class = {
"Logistic Regression": LogisticRegression(),
"Random Forest Classification": RandomForestClassifier(),
"Gradient Boosting Classification": GradientBoostingClassifier()
}
# Обучаем и оцениваем модели для задачи классификации
print("Результаты для задачи классификации:")
for name, model in models_class.items():
model.fit(X_train_class, y_train_class)
y_pred_class = model.predict(X_test_class)
accuracy = accuracy_score(y_test_class, y_pred_class)
print(f"Model: {name}")
print(f"Accuracy: {accuracy}")
print()