#!/usr/bin/env python # coding: utf-8 # # Расчет площадей лесных пожаров # In[119]: import matplotlib.pyplot as plt import math import numpy as np import pandas as pd import random import sklearn # importing sklearn libraries from sklearn import neural_network, linear_model, preprocessing, svm, tree from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier from sklearn.metrics import accuracy_score, mean_squared_error, r2_score from sklearn.model_selection import train_test_split from sklearn.linear_model import LassoLarsCV from sklearn.linear_model import Lasso get_ipython().run_line_magic('matplotlib', 'inline') # # Загрузка данных # В данные входят следующие величины: # # X - Пространственная координата оси X на карте парка Монтезиньо: от 1 до 9 # Y - Пространственная координата оси X на карте парка Монтезиньо: от 2 до 9 # month - название месяца: "jan" до "dec" # day - день недели: "mon" до "sun" # FFMC - FFMC-индекс FWI-системы: от 18.7 до 96.20 # DMC - DMC-индекс FWI-системы: от 1.1 до 291.3 # DC - DC-индекс FWI-системы: от 7.9 до 860.6 # ISI - ISI-индекс FWI-системы: от 0.0 до 56.10 # temp - температура воздуха в Цельсиях: от 2.2 до 33.30 # RH - относительная влажность в%: от 15.0 до 100 # wind - скорочть ветра в км/ч: от 0.40 до 9.40 # rain - количество осадков в мм/м2: от 0.0 до 6.4 # area - размер территории леса, охваченной огнем(в гектарах): от 0.00 до 1090.84 # # In[120]: forest_fires = pd.read_csv('forestfires.csv') # In[121]: forest_fires.head() # # Статистический анализ данных # Рассмотрим значение стандартных статистических величин у каждого из данных признаков, а так же попарную корелляцию # In[122]: forest_fires.describe() # In[123]: # Попарная корелляция между признаками forest_fires.corr() # # Линейная модель # In[124]: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) # # Значение весов и параметр регуляризации # Для начала расчитаем коэффициенты регрессии в нашей модели и поймем все ли признаки имеют некоторый вес в нашей модели # In[125]: est = LassoLarsCV(cv=10, precompute=False).fit(X_train, y_train) est.coef_ # Как мы видим в данной модели только 1 признак имеет некоторый вес. Этот признак - DMC. Построим график зависимости веса от параметра регуляризации # In[126]: est.alphas_ alphas = est.alphas_ plt.plot(alphas, est.coef_path_.T); # # Зависимости общей ошибки от параметра регуляризации # In[127]: X = pd.get_dummies(X, drop_first=True) # In[128]: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) # In[129]: errors = [] for i in np.linspace(1e-1, 1e+2, 30): est = sklearn.linear_model.Lasso(alpha=i) errors.append(sklearn.model_selection.cross_val_score(est, X, y).mean()**2) # In[130]: plt.plot(np.linspace(1e-1, 1e+2, 30), errors); # # Зависимость ошибки от числа признаков # In[131]: mses1 = [] mses2 = [] for i in range(1,13): est=Lasso(alpha=10) est.fit(X_train.iloc[:,0:i],y_train) predictions = est.predict(X_test.iloc[:,0:i]) mses1 = np.append(mses1, [mean_squared_error(y_test, predictions)]) # In[132]: plt.figure() plt.plot(range(1,13), mses1); # # Вывод # Как говорилось уже в самом описании к этим данным - такого количества недостатосно для описания полноценной линейной модели. Как мы видим она чаще ошибается чем оказывается права, что не является хорошим показателем данной модели. Однако, как мы видим, она выдает постоянный уровень ошибки при 8 и более признаках.