#!/usr/bin/env python # coding: utf-8 # In[9]: import pandas as pd import numpy as np import matplotlib.pylab as plt from sklearn.cross_validation import train_test_split, cross_val_score from sklearn.linear_model import LassoLarsCV from sklearn.metrics.scorer import make_scorer from sklearn.metrics import mean_squared_error from sklearn import metrics import seaborn as sns # Данные # In[10]: data = pd.read_csv('forestfires.csv') data.head(3) # In[11]: #перевожу заголовки в загланые буквы data.columns = map(str.upper, data.columns) # удаляю пропущенные значения, если они есть data_clean = data.dropna() # Перевод качественных признаком в количественные data_clean.MONTH.replace(to_replace=dict(mar=3, oct=10, jan = 1, feb = 2, apr = 4, may = 5, jun = 6, jul = 7, aug = 8, sep = 9, nov = 11, dec = 12), inplace=True) data_clean.DAY.replace(to_replace=dict(mon = 1, tue = 2, wed = 3, thu = 4, fri = 5, sat = 6, sun = 7), inplace=True) # In[12]: data_clean.head() # In[13]: #выбираю матрицу признаков и целевой признак predvar= data_clean[['X', "Y", 'MONTH', 'DAY','FFMC','DMC','DC','ISI','TEMP','RH','WIND','RAIN']] target = data_clean.AREA # In[14]: # стандартизация признаков (mean=0 and sd=1) predictors=predvar.copy() from sklearn import preprocessing predictors['X']=preprocessing.scale(predictors['X'].astype('float64')) predictors['Y']=preprocessing.scale(predictors['Y'].astype('float64')) predictors['MONTH']=preprocessing.scale(predictors['MONTH'].astype('float64')) predictors['DAY']=preprocessing.scale(predictors['DAY'].astype('float64')) predictors['FFMC']=preprocessing.scale(predictors['FFMC'].astype('float64')) predictors['DMC']=preprocessing.scale(predictors['DMC'].astype('float64')) predictors['DC']=preprocessing.scale(predictors['DC'].astype('float64')) predictors['ISI']=preprocessing.scale(predictors['ISI'].astype('float64')) predictors['TEMP']=preprocessing.scale(predictors['TEMP'].astype('float64')) predictors['RH']=preprocessing.scale(predictors['RH'].astype('float64')) predictors['WIND']=preprocessing.scale(predictors['WIND'].astype('float64')) predictors['RAIN']=preprocessing.scale(predictors['RAIN'].astype('float64')) # In[15]: # график зависимости целового признака от остальных fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(15, 10)) for idx, feature in enumerate(data_clean.columns[:-1]): data_clean.plot(feature, y="AREA", subplots=True, kind="scatter", ax=axes[idx // 4, idx % 4]) # In[30]: #распределение значений целевого признака plt.hist(data_clean['AREA'], bins = 20) # Видно, что выборка несбалансированная # In[16]: #зависимость площади от координат # In[17]: heat_point = data_clean.pivot_table(index = 'Y', columns = 'X', values = 'AREA', aggfunc = np.mean).fillna(0) sns.heatmap(heat_point, annot=True, fmt=".1f") # In[18]: #попарные корреляции между признаками correlations = data_clean.corr() sns.heatmap(correlations, annot=True, fmt=".1f") # ## Линейная регрессия с Лассо-регуляризацией # In[19]: pred_train, pred_test, tar_train, tar_test = train_test_split(predictors, target, test_size=.3, random_state=123) # In[20]: model=LassoLarsCV(cv=10, precompute=False).fit(pred_train,tar_train) predictions = model.predict(pred_test) # In[21]: # коэффициены регрессии print(dict(zip(predictors.columns, model.coef_))) # По весовым коэффициентам видно, что имеют значение только признаки X, Y, TEMP, RH. Коэффициенты у всех остальных признаков = 0. Самые значительные признаки: X, TEMP. # In[22]: model.alphas_ # In[23]: # график зависимости значений весов от параметра регуляризации alphas = model.alphas_ ax = plt.gca() plt.plot(alphas, model.coef_path_.T) plt.axvline(model.alpha_, linestyle='--', color='k', label='alpha CV') plt.ylabel('Regression Coefficients') plt.xlabel('alpha') plt.title('Regression Coefficients Progression for Lasso Paths') # In[24]: model.cv_alphas_ # In[25]: # plot mean square error for each fold m_log_alphascv = -np.log10(model.cv_alphas_) plt.figure() plt.plot(m_log_alphascv, model.cv_mse_path_, ':') plt.plot(m_log_alphascv, model.cv_mse_path_.mean(axis=-1), 'k', label='Average across the folds', linewidth=2) plt.axvline(-np.log10(model.alpha_), linestyle='--', color='k', label='alpha CV') plt.legend() plt.xlabel('-log(alpha)') plt.ylabel('Mean squared error') plt.title('Mean squared error on each fold') # In[26]: #Регрессор LassoCV обучен на всех параметрах регуляризации. График усреднённой MSE в зависимости от параметра регуляризации. from sklearn.linear_model import LassoCV headers = data_clean.columns.values.tolist() alphas = np.arange(1, 100, 5) lasso_cv = LassoCV(alphas = alphas) lasso_cv.fit(predictors, target) print('Выбранное значение параметра регуляризации:', lasso_cv.alpha_) print('Обученные веса, соответствующие этому значению:', list(zip(headers, lasso_cv.coef_))) mses = np.mean(lasso_cv.mse_path_[:, :], axis=1) print('Усреднённые по строкам MSE:',mses) plt.plot(lasso_cv.alphas_, mses) plt.xlabel('alphas') plt.ylabel('MSE') # In[27]: from sklearn.metrics import mean_squared_error train_error = mean_squared_error(tar_train, model.predict(pred_train)) test_error = mean_squared_error(tar_test, model.predict(pred_test)) print ('training data MSE') print(train_error) print ('test data MSE') print(test_error) # ## Зависимость значения ошибки от сложности (числа признаков) на обучении и контроле. # In[28]: mses1 = [] mses2 = [] for i in range(1,13): model1=LassoLarsCV(cv=10, precompute=False).fit(pred_train.iloc[:,0:i],tar_train) predictions1 = model1.predict(pred_test.iloc[:,0:i]) #print(dict(zip(predictors.columns, model.coef_))) scores1 = -1*cross_val_score(model1, predictors.iloc[:,0:i], target, scoring='neg_mean_squared_error', cv=10) #print('MSE: (i признаков)', metrics.mean_squared_error(tar_test, predictions1)) #print('MSE: (cv = 10)', scores1.mean()) mses1 = np.append(mses1, [metrics.mean_squared_error(tar_test, predictions1)]) mses2 = np.append(mses2, [scores1.mean()]) # In[31]: Npredictors = range(1,13) # график MSE для разного количество признаков на test set plt.figure() plt.plot(Npredictors, mses1, color = 'red',label='MSE on test set') plt.plot(Npredictors, mses2, color = 'green', label='MSE on train set') plt.legend() plt.xlabel('Number of features') plt.ylabel('Mean squared error') plt.title('Mean squared error on different number of predictors') plt.savefig('Gr1.png', bbox_inches='tight', dpi=500) # In[ ]: # In[ ]: