Описание
Компания реализовала более 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%