Готов новый проект в рамках моей учёбы в Data Science — разработка системы предупреждения аварий на каршеринге. Мне удалось построить модель машинного обучения, способную предсказать вероятность аварии на основе исторических данных, которые хранятся в СУБД. Эта модель поможет создать устройство, которое будет предупреждать водителя о потенциальной опасности.
Цель проекта: разработать систему машинного обучения для предсказания вероятности аварий на каршеринге на основе анализа исторических данных о поездках, погодных условиях, времени суток и характеристиках автомобилей.
Архитектура решения
Извлечение и подготовка данных
Работа с данными начинается с извлечения информации из PostgreSQL базы данных:
importpandasaspdimportnumpyasnpfromsqlalchemyimportcreate_enginefromsklearn.preprocessingimportStandardScaler,LabelEncoderfromsklearn.model_selectionimporttrain_test_splitdefextract_carsharing_data(db_connection_string):"""Извлечение данных о поездках и авариях из базы данных."""# Создание подключения к базе данныхengine=create_engine(db_connection_string)# Загрузка данных о поездкахquery_trips="""
SELECT
trip_id,
car_id,
driver_id,
start_time,
end_time,
distance_km,
duration_minutes,
weather_condition,
road_type,
time_of_day,
day_of_week,
had_accident
FROM carsharing_trips
WHERE start_time >= '2024-01-01'
"""trips_df=pd.read_sql(query_trips,engine)# Загрузка данных о автомобиляхquery_cars="""
SELECT
car_id,
car_age_years,
maintenance_status,
last_service_days,
total_mileage
FROM carsharing_cars
"""cars_df=pd.read_sql(query_cars,engine)# Объединение данныхmerged_df=pd.merge(trips_df,cars_df,on='car_id',how='left')returnmerged_df,engine
Предобработка данных
Критический этап для подготовки данных к обучению модели:
defpreprocess_carsharing_data(df):"""Предобработка данных для обучения модели."""# Преобразование временных признаковdf['start_time']=pd.to_datetime(df['start_time'])df['hour']=df['start_time'].dt.hourdf['month']=df['start_time'].dt.monthdf['is_weekend']=df['start_time'].dt.dayofweek>=5# Кодирование категориальных признаковcategorical_cols=['weather_condition','road_type','time_of_day','day_of_week','maintenance_status']label_encoders={}forcolincategorical_cols:ifcolindf.columns:le=LabelEncoder()df[col+'_encoded']=le.fit_transform(df[col].fillna('Unknown'))label_encoders[col]=le# Создание новых признаковdf['speed_kmh']=df['distance_km']/(df['duration_minutes']/60)df['trip_intensity']=df['distance_km']*df['speed_kmh']df['car_usage_intensity']=df['car_age_years']*df['total_mileage']# Обработка пропущенных значенийnumeric_cols=df.select_dtypes(include=[np.number]).columnsdf[numeric_cols]=df[numeric_cols].fillna(df[numeric_cols].median())# Определение признаков и целевой переменнойfeature_cols=['distance_km','duration_minutes','hour','month','is_weekend','car_age_years','last_service_days','total_mileage','speed_kmh','trip_intensity','car_usage_intensity']# Добавление закодированных категориальных признаковforcolincategorical_cols:encoded_col=col+'_encoded'ifencoded_colindf.columns:feature_cols.append(encoded_col)X=df[feature_cols]y=df['had_accident'].astype(int)# Масштабирование признаковscaler=StandardScaler()X_scaled=scaler.fit_transform(X)# Разделение на обучающую и тестовую выборкиX_train,X_test,y_train,y_test=train_test_split(X_scaled,y,test_size=0.2,random_state=42,stratify=y)returnX_train,X_test,y_train,y_test,scaler,feature_cols,label_encoders
Модель машинного обучения
Использование Gradient Boosting для задачи классификации:
defplot_feature_importance(feature_importance,top_n=15):"""Визуализация важности признаков."""top_features=feature_importance.head(top_n)plt.figure(figsize=(10,8))plt.barh(range(len(top_features)),top_features['importance'])plt.yticks(range(len(top_features)),top_features['feature'])plt.xlabel('Feature Importance',fontsize=12)plt.title(f'Top {top_n} Most Important Features for Accident Prediction',fontsize=14)plt.gca().invert_yaxis()plt.grid(True,alpha=0.3,axis='x')plt.tight_layout()plt.show()
classAccidentWarningSystem:"""Система предупреждения аварий в реальном времени."""def__init__(self,model,scaler,feature_cols,threshold=0.7):self.model=modelself.scaler=scalerself.feature_cols=feature_colsself.threshold=thresholddefpredict_accident_risk(self,trip_data):"""Предсказание риска аварии для текущей поездки."""# Подготовка данныхtrip_df=pd.DataFrame([trip_data])# Применение тех же преобразований, что и при обученииtrip_df=self._apply_preprocessing(trip_df)# Масштабирование признаковX=trip_df[self.feature_cols]X_scaled=self.scaler.transform(X)# Предсказание вероятностиprobability=self.model.predict_proba(X_scaled)[0,1]# Принятие решенияifprobability>=self.threshold:warning_level="HIGH"message=f"⚠️ ВНИМАНИЕ: Высокий риск аварии ({probability:.1%})"elifprobability>=0.4:warning_level="MEDIUM"message=f"⚠️ Повышенный риск аварии ({probability:.1%})"else:warning_level="LOW"message=f"✅ Риск аварии низкий ({probability:.1%})"return{'probability':probability,'warning_level':warning_level,'message':message,'recommendation':self._get_recommendation(warning_level)}def_apply_preprocessing(self,df):"""Применение предобработки к данным поездки."""# Реализация тех же преобразований, что и в data_preprocessing.py# ...returndfdef_get_recommendation(self,warning_level):"""Получение рекомендаций на основе уровня предупреждения."""recommendations={'HIGH':'Немедленно снизьте скорость, увеличьте дистанцию, будьте готовы к экстренному торможению.','MEDIUM':'Соблюдайте осторожность, следите за дорожной обстановкой, избегайте резких маневров.','LOW':'Продолжайте движение с соблюдением ПДД.'}returnrecommendations.get(warning_level,'Соблюдайте правила дорожного движения.')
Заключение
Проект демонстрирует практическое применение машинного обучения для повышения безопасности на дорогах. Разработанная система может быть интегрирована в каршеринговые платформы для предупреждения водителей о потенциально опасных ситуациях, что может значительно снизить количество аварий.
Дальнейшее развитие:
Интеграция с GPS-данными в реальном времени
Добавление данных о дорожном трафике и погодных условиях
Использование глубокого обучения для анализа видео с камер
Разработка мобильного приложения для водителей
Создание дашборда для мониторинга безопасности флота
Ссылки и ресурсы
Посмотреть полный проект с кодом и визуализациями можно на GitHub: