Описание

Компания реализовала более 100 проектов по повышению энергоэффективности и в настоящее время дистанционно управляет нагрузкой мощностью более 100 МВт, включая тысячи уличных фонарей и десятки тысяч насосов.

CCMS или автономный контроллер уличного освещения — это панель управления с комплексной защитой, станцией управления и контроля для группы уличных фонарей. Он включает измерительный блок класса 1.0 и обменивается данными с веб-сервером SMART с помощью соединения GSM/GPRS.

Основные характеристики контроллера уличного освещения:

Защита от повышенного/пониженного напряжения

Защита от перегрузки

Защита от короткого замыкания

Автоматическое исправление неприятных отключений MCB

Устойчив к колебаниям входного напряжения

Защита от перенапряжения до 40 кА

Астрономический / Фотоэлемент / Настраиваемое время включения / выключения

Уведомление о сбоях

Постановка задачи:

Перед нами стоит задача предсказать количество единиц, потребляемых каждым контроллером уличного освещения. Данные поступают с устройства IoT, развернутого в различных штатах Индии.

Сопоставление реальной проблемы с проблемой машинного обучения

Тип задачи машинного обучения

Обучение под наблюдением:

Это проблема регрессии, для заданных данных нам нужно предсказать энергопотребление контроллера уличного освещения.

Поезд и тестовая конструкция

Мы строим поезд и тестируем путем случайного разделения в соотношении 70:30 или 80:20 в зависимости от того, что мы выбираем, поскольку у нас достаточно точек для работы.

Импорт необходимых библиотек

import numpy as np
import pandas as pd

Чтение данных

data=pd.read_csv('Day_Report- dayreport.csv')

Сколько пропущенных значений в наборе данных?

#Credit:Prof-Vejey
for i in range(len(data.columns)):
missing_data = data[data.columns[i]].isna().sum()
perc = missing_data / len(data) * 100
print(f'Feature {i+1} >> Missing entries: {missing_data}  |  Percentage: {round(perc, 2)}')
Output:
Feature 1 >> Missing entries: 0  |  Percentage: 0.0
Feature 2 >> Missing entries: 0  |  Percentage: 0.0
Feature 3 >> Missing entries: 0  |  Percentage: 0.0
Feature 4 >> Missing entries: 0  |  Percentage: 0.0
Feature 5 >> Missing entries: 0  |  Percentage: 0.0
Feature 6 >> Missing entries: 0  |  Percentage: 0.0
Feature 7 >> Missing entries: 0  |  Percentage: 0.0
Feature 8 >> Missing entries: 0  |  Percentage: 0.0
Feature 9 >> Missing entries: 0  |  Percentage: 0.0
Feature 10 >> Missing entries: 0  |  Percentage: 0.0
Feature 11 >> Missing entries: 0  |  Percentage: 0.0
Feature 12 >> Missing entries: 0  |  Percentage: 0.0
Feature 13 >> Missing entries: 0  |  Percentage: 0.0
Feature 14 >> Missing entries: 0  |  Percentage: 0.0
Feature 15 >> Missing entries: 0  |  Percentage: 0.0
Feature 16 >> Missing entries: 0  |  Percentage: 0.0
Feature 17 >> Missing entries: 0  |  Percentage: 0.0
Feature 18 >> Missing entries: 0  |  Percentage: 0.0
Feature 19 >> Missing entries: 0  |  Percentage: 0.0
Feature 20 >> Missing entries: 0  |  Percentage: 0.0
Feature 21 >> Missing entries: 0  |  Percentage: 0.0
Feature 22 >> Missing entries: 0  |  Percentage: 0.0
Feature 23 >> Missing entries: 0  |  Percentage: 0.0
Feature 24 >> Missing entries: 0  |  Percentage: 0.0
Feature 25 >> Missing entries: 0  |  Percentage: 0.0

Визуальное представление пропущенных значений

plt.figure(figsize=(10,6))sns.heatmap(data.isna(), cbar=False, cmap='viridis', yticklabels=False)

У нас нет пропущенных значений в этом наборе данных

Обработка категориальных данных

#Converting the categorical variable into numerical using lable encoder
from sklearn.preprocessing import LabelEncoder
labelencoder_X=LabelEncoder()
xm=data.apply(LabelEncoder().fit_transform)

Разделение данных

Входные функции (независимые переменные)

X = xm.iloc[:,:22]

Выходные характеристики (зависимая переменная)

y=xm.iloc[:,-3]

Вывод:

0        92
1        61
2       466
3       109
4       231
       ... 
3315    186
3316    277
3317    255
3318     97
3319    170
Name: Units_Consumed, Length: 3320, dtype: int64

Форма

X.shape, y.shape

Вывод:

((3320, 22), (3320,))

График значений корреляции для каждой функции

xm.corr()

Построение тепловой карты

import matplotlib.pyplot as plt
from matplotlib import rcParams
from matplotlib.cm import rainbow
%matplotlib inline
import seaborn as sns
#get correlations of each features in dataset
corrmat = xm.corr()
top_corr_features = corrmat.index
plt.figure(figsize=(25,25))
#plot heat map
g=sns.heatmap(xm[top_corr_features].corr(),annot=True,cmap="RdYlGn")

Важность функции

from sklearn.ensemble import ExtraTreesRegressor
import matplotlib.pyplot as plt
model = ExtraTreesRegressor()
model.fit(X,y)

Вывод

ExtraTreesRegressor()
print(model.feature_importances_)
[0.00111575 0.0010493  0.00683585 0.00699789 0.00946878 0.00637712
 0.0055329  0.         0.00219048 0.01284271 0.00211877 0.00238352
 0.00219037 0.39728364 0.11421965 0.01114137 0.00585853 0.01221955
 0.00474951 0.00181446 0.19711146 0.19649837]

График важности функций для лучшей визуализации

feat_importances = pd.Series(model.feature_importances_, index=X.columns)
feat_importances.nlargest(10).plot(kind='barh')
plt.show()

Построение модели

1. Регрессор случайного леса

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state=0)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
Output
(2324, 22)
(996, 22)
(2324,)
(996,)
RFR_model = RandomForestRegressor(n_estimators = 100, random_state = 0)
RFR_model.fit(X_train, y_train)
RandomForestRegressor(random_state=0)
y_pred_test = RFR_model.predict(X_test)
y_pred_test
Printing the accuracy of the model
print('Test_Accuracy',RFR_model.score(X_test, y_test))
print('Train_Accuracy:',RFR_model.score(X_train, y_train))

Test_Accuracy 0,9640351728540623
Train_Accuracy: 0,9960454751769023

Среднеквадратическая ошибка модели RFR

from sklearn.metrics import mean_squared_error
rmse = np.sqrt(mean_squared_error(y_test,y_pred_test))
print ("RMS Error: ", rmse)
r_squared = RFR_model.score(X_train, y_train)
print ("R_squared is: ", r_squared)

Ошибка RMS: 21,713333440455095
R_squared: 0,9960454751769023

2. Линейная регрессия

from sklearn.linear_model import LinearRegression
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state=0)
lm = LinearRegression()
lm.fit(X_train, y_train)
LinearRegression()
Y_pred = lm.predict(X_test)

Коэффициенты

lm.coef_

Вывод

array([ 1.16921600e-01, -2.23450188e-01, -6.13966338e+00, -3.52650301e-01,
       -2.72788705e-03,  3.47502449e-02, -1.58259687e-02,  7.15899562e-12,
       -9.68853018e+01,  2.17651756e-02, -7.47146989e-03,  6.74982503e-03,
       -1.70253916e-02,  1.00141656e+00,  1.01928212e+00,  1.91340058e+00,
        4.62835027e-02,  2.40675667e-02, -2.76240869e+00,  5.56699826e+00,
       -1.36397328e+00,  1.37660411e+00])

Печать точности модели

Test_Accuracy=lm.score(X_test,y_test)
Train_Accuracy=lm.score(X_train,y_train)
print("Test_Accuracy:",Test_Accuracy)
print("Train_Accuracy:",Train_Accuracy)

Test_Accuracy: 0,8907092662149891
Train_Accuracy: 0,9360551828509803

Среднеквадратическая ошибка модели LR

from sklearn.metrics import mean_squared_error
rmse = np.sqrt(mean_squared_error(y_test,y_pred_test))
print ("RMS Error: ", rmse)
r_squared = lm.score(X_train, y_train)
print ("R_squared is: ", r_squared)

Ошибка RMS: 21,713333440455095
R_squared: 0,9360551828509803

3. Регрессор повышения градиента

from sklearn.ensemble import GradientBoostingRegressor
reg = GradientBoostingRegressor(random_state=0)
reg .fit(X_train, y_train)
GradientBoostingRegressor(random_state=0)
y_pred = reg.predict(X_test)

Печать точности модели

print("Accuracy:",reg.score(X_test,y_test))
print("Accuracy:",reg.score(X_train,y_train))

Точность: 0,9498582303353704
Точность: 0,9822518924310136

Среднеквадратическая ошибка модели GBR

from sklearn.metrics import mean_squared_error
rmse = np.sqrt(mean_squared_error(y_test,y_pred_test))
print ("RMS Error: ", rmse)​
r_squared = reg.score(X_train, y_train)
print ("R_squared is: ", r_squared)

Ошибка RMS: 21,713333440455095
R_squared: 0,9822518924310136

5. Заключение

print('\n                     Accuracy     Error')
print('                     ----------   --------')
print('Linear Regression   : {:.04}%        {:.04}%'.format( lm.score(X_test, y_test)* 100,\100-(lm.score(X_test, y_test) * 100)))
print('Random Forest       :  {:.04}%        {:.04}% '.format(RFR_model.score(X_test, y_test)* 100,\100-(RFR_model.score(X_test, y_test)* 100)))
print('Gradient Boosting   : {:.04}%        {:.04}% '.format(reg.score(X_test, y_test)* 100,\100-(reg.score(X_test, y_test)* 100)))
                      Accuracy      Error
                     ----------   --------
Linear Regression   : 89.07%        10.93%
Random Forest       :  96.4%        3.596% 
Gradient Boosting   : 94.99%        5.014%