С чего начать систему контроля отклонения от нормы?

Рейтинг: 0Ответов: 2Опубликовано: 09.02.2023

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

Дано:

Есть массив данных ( скорость вращения двигателя, момент на валу)

data = [
    (5000,5000,5000,5000,4800,4800,4800,5000,5000), # drive speed
    (9.12, 9.18, 9.11, 9.05, 8.88, 8.93, 8.89, 9.10, 9.12) # drive torque
    ]

(данных много больше, накидал примерный вид)

Цель - сделать модель, которая обучается на большом наборе таких данных, а потом получая на вход похожие значения, сравнивает с "образцом" и контролируется отклонение от нормы. Контролируется зависимость одного параметра от другого, те если при скорости 5000 момент на валу обычно равен 9.10-9.40 , то при значении 10.43 я буду более низкий коэфф\итоговое значение

С чего начать решение данной задачи? Направьте пожалуйста.

Ответы

▲ 3Принят

Ну можно, конечно, учиться читать начинать с чтения "Войны и мир", а погружение в тему "и прочего" - с изучение TensorFlow абсолютно не понимая, ни что оно там делает, ни зачем оно это делает, на как оно это делает.

Изучение " темы нейросетей и прочего" надо начинать с самого начала. То что вы написали к нейросетям не имеет (пока еще) никакого отношения. Это простейшая задача регрессии, которая решалась за 70 лет до возникновения самого понятия нейросетей. Поняв, что это такое и как работает - можно действительно разобраться и понять, что такое машинное обучение (и нейросети в том числе), а не считать, что все сводиться к вызову функций fit() и predict().

Конкретно ваша задача

import numpy as np
import matplotlib.pyplot as plt
x=np.array([5000,5000,5000,5000,4800,4800,4800,5000,5000]) # drive speed
y=np.array([9.12, 9.18, 9.11, 9.05, 8.88, 8.93, 8.89, 9.10, 9.12]) # drive torque
numerator=np.sum((x-np.mean(x))*(y-np.mean(y)))
denominator=np.sum((x-np.mean(x))**2)
b1=numerator/denominator
b0=np.mean(y)-b1*np.mean(x)
y_pred=b0+b1*x 
plt.plot(x,y_pred,c='g')

Вот результат: введите сюда описание изображения

Ответить на вопрос, а какой момент должен быть при - например - 4830 оборотах, становиться элементарно:

x0=4830
print('Обороты=',x0, '  Момент=',b0+b1*x0)

Ответ:

Обороты= 4830   Момент= 8.932

Когда поймете, как оно работает, можно упростить себе жизнь, перейдя к использованию, например, библиотеки scikit-learn (в просторечии sklearn) и ее широченных возможностей. Тоже, что и выше там делается вообще в одну строку:

from sklearn.linear_model import LinearRegression
у_pred = LinearRegression().fit(x.reshape(-1,1),y).predict([[x0]])

Результат:

Обороты= 4830   Момент= [8.932]

После этого можно разбираться дальше, и узнать, что метод линейной регрессии позволяет оценить диапазон значений отклика (в вашем примере - момента) в котором с заданным процентом уверенности при данном значении оборотов должно лежать значение в "нормальной" ситуации. Выход за этот доверительный интервал может трактоваться как "аномальное" значение, сигнализирующее в данном примере о неправильной работе двигателя. Тут я этого показывать не буду, но делается это решение тоже в пару строк.

Потом можно углубляться в тонкости и делать уже более тонкую настройку модели, о чем коллеги написали. При этом понимая, что зачем и когда.

А уж потом, для тех "сложноподчиненных" случаев, когда модели регрессии почему-то не работают, можно подкатить и тяжелую артиллерию в виде TensorFlow, PyTorch и пр. При этом вы и разберетесь что к чему, и навыки приобретете на будущее.

P.S. Еще раз посмотрел на ваши данные. Сейчас этого не понять, но если вдруг, по семантике вашей задачи окажется, что обороты могут иметь только какие-то фиксированные значения - например ТОЛЬКО 4800, 5000 и 5200, то тогда задача еще дальше уходит от нейронных сетей и сводиться к анализу распределений значений моментов и поиска "выбросов". Там уже работают совершенно другие методы анализа. Если это так - пишите, разберемся подробно.

▲ 1

Начните с:

  1. Предобработка данных - нормализация входных данных, деление данных на обучающую и тестовую выборки, удаление выбросов и прочее, чтобы улучшить качество данных

  2. Определение модели - можете использовать регрессионную модель, линейную регрессию, нейронную сеть или другой подход, который лучше подходит для вашей задачи. Можно использовать линейную регрессию, чтобы исследовать зависимость между переменными

  3. Оценка модели. После обучения модели, вы должны проверить ее точность, используя метрики, например, среднеквадратическое отклонение, обратное распределение хи-квадрат, точность и т.д.

  4. Оценка качества модели - используя тестовые данные, вы можете оценить точность модели и ее способность предсказывать значения момента на валу.

  5. Оценка качества модели. После обучения модели, важно оценить ее качество. Для этого можно использовать техники кросс-валидации, например, k-fold cross-validation. Это позволяет оценить насколько хорошо модель обобщается на новые данные.

  6. Регуляризация. Чтобы избежать переобучения, можно использовать регуляризацию. Это включает в себя добавление штрафа к функции потерь, который затрудняет модель в получении слишком сложных весов. Популярные виды регуляризации - L1 и L2 регуляризация.

  7. Тюнинг гиперпараметров. Гиперпараметры - это параметры, которые не могут быть определены во время обучения модели, но влияют на ее производительность. Такие как, например, размер батча, количество эпох, размер сети и т.д.


import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

data = [
    (5000,5000,5000,5000,4800,4800,4800,5000,5000), # drive speed
    (9.12, 9.18, 9.11, 9.05, 8.88, 8.93, 8.89, 9.10, 9.12) # drive torque
    ]
# convert the data into numpy arrays
drive_speed = np.array(data[0])
drive_torque = np.array(data[1])

# normalize the data
drive_speed = (drive_speed - np.mean(drive_speed)) / np.std(drive_speed)
drive_torque = (drive_torque - np.mean(drive_torque)) / np.std(drive_torque)

# create a dataset object from the numpy arrays
dataset = tf.data.Dataset.from_tensor_slices((drive_speed, drive_torque))

# create a model
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(units=1, input_shape=[1]))

# compile the model
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.001), loss='mean_squared_error')

# train the model
history = model.fit(drive_speed, drive_torque, epochs=1000)

# plot the loss
plt.plot(history.history['loss'])
plt.show()

Или другой подход c использованием линейной регрессии

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# Преобразуем данные в numpy массивы
speed = np.array(data[0]).reshape(-1, 1)
torque = np.array(data[1]).reshape(-1, 1)

# Разбиваем данные на тестовую и обучающую выборки
speed_train, speed_test, torque_train, torque_test = train_test_split(speed, torque, test_size=0.2)

# Обучаем модель
reg = LinearRegression().fit(speed_train, torque_train)

# Делаем предсказание на тестовых данных
torque_pred = reg.predict(speed_test)

# Оцениваем качество модели
score = reg.score(speed_test, torque_test)
print("R^2 score:", score)

# Визуализируем результаты
plt.scatter(speed_test, torque_test, color='black')
plt.plot(speed_test, torque_pred, color='blue', linewidth=3)
plt.xlabel('Speed')
plt.ylabel('Torque')
plt.title('Linear Regression Model')
plt.show()

введите сюда описание изображения