Прогнозирование возраста по весу и росту с использованием нейронных сетей

#python #neural-network

#python #нейронная сеть

Вопрос:

Я новичок в машинном обучении, и я пытался написать и алогритим, чтобы предсказать возраст человека в зависимости от его веса и роста

Вот мои данные:

 import numpy as np
import matplotlib.pyplot as plt

# weight,height,age

data=[[50,160,15],
      [45,156,13],
      [55,162,17],
      [56,163,18],
      [58,163.4,20],
      [12,85,2],
      [14.2,95,3],
      [15.4,100,4],
      [32,138.4,10],
      [25.8,128.3,8]]

# missing age data
mys=[22.4,121.1]
  

взятие случайных величин весов

 w1=np.random.rand()
w2=np.random.rand()
b=np.random.rand()
  

для визуализации данных

  for i in range(len(data)):
      point=data[i]
      plt.xlabel('weight')
      plt.ylabel('length')
    
    
      plt.scatter(point[0],point[1],c='red')
    plt.scatter(mys[0],mys[1],marker='x',color='black',s=80)
  

вот моя нейронная сеть

 alpha=0.00001


for i in range(500):
  ri=np.random.randint(len(data))
  point=data[ri]

  pred=(point[0]*w1) (point[1]*w2) b
  target=point[2]
  cost=(pred-target)**2


  dcost_pred=2*(pred-target)
  dpred_w1=point[1]
  dpred_w2=point[0]
  dpred_db=1

  dcost_w1=dcost_pred*dpred_w1
  dcost_w2=dcost_pred*dpred_w2
  dcost_b=dcost_pred*dpred_db

  w1=(w1-alpha*dcost_w1)
  w2=w2-alpha*dcost_w2
  b=b-alpha*dcost_b
  print(cost)
  

к сожалению, моя стоимость продолжает расти, у меня также есть два вопроса
1-Когда я должен использовать сигмоид?
2-Как выбрать правильную альфу?

ps: я ожидаю вывода 7 (возраст отсутствующих данных)

Комментарии:

1. сигмоид не является выбором активации для регрессии. Кроме того, alpha — это гиперпараметр, что означает, что вы должны настраивать его вручную. вы можете рассмотреть возможность увеличения его логарифмически.

2. Ваш код кажется правильным. Я бы посоветовал вам написать его, используя класс и методы для ясности. Кроме того, используйте numpy в процессе. передача пакетов в сети. Это будет работать быстрее.

3. @ragnar я все больше запутываюсь, потому что все кажется хорошим

4. я попытался использовать альфа-значение в качестве случайного числа, но это также не сработало

5. начните альфа с более высокого значения, скажем, альфа = 1, затем сделайте его 0,1. Позже уменьшите моду на 1e-2, 1e-3, 1e-4 и так далее.

Ответ №1:

Вопрос, который вы задали, состоит из трех частей.

1-я часть (что не так с кодом) Ответ: В этом нет ничего плохого. Просто правильный lr и инициализация

2-я часть (где использовать сигмоид). Ответ: нигде в регрессии.

3-я часть (правильная альфа): Ответ: начните с 1. запустите модель и наблюдайте за потерей. Сделайте alpha = 1e-1 и так далее. Во всем процессе наблюдаются потери. Какая бы альфа-версия ни давала небольшие потери, выберите это.

Код для 1-й части: (Выполните следующие действия)

 b=np.zeros((1,))
alpha=1e-5
  

Да, именно так 🙂 Вы можете сохранить список потерь для каждой потери эпохи. Я сохранил это для вашего кода и получил следующий график. (Обратите внимание, что я использовал только 50 эпох. вы можете сохранить более высокие значения)

Кривая потерь

Полный код

 import numpy as np
import matplotlib.pyplot as plt

# weight,height,age

data=[[50,160,15],
      [45,156,13],
      [55,162,17],
      [56,163,18],
      [58,163.4,20],
      [12,85,2],
      [14.2,95,3],
      [15.4,100,4],
      [32,138.4,10],
      [25.8,128.3,8]]

# missing age data
mys=[22.4,121.1]

w1=np.random.rand()
w2=np.random.rand()
b=0
alpha=0.00001

loss = []
for i in range(50):
  ri=np.random.randint(len(data))
  point=data[ri]

  pred=(point[0]*w1) (point[1]*w2) b
  target=point[2]
  cost=(pred-target)**2


  dcost_pred=2*(pred-target)
  dpred_w1=point[1]
  dpred_w2=point[0]
  dpred_db=1

  dcost_w1=dcost_pred*dpred_w1
  dcost_w2=dcost_pred*dpred_w2
  dcost_b=dcost_pred*dpred_db

  w1=(w1-alpha*dcost_w1)
  w2=w2-alpha*dcost_w2
  b=b-alpha*dcost_b
  loss.append(cost)

plt.plot(loss)
  

Комментарии:

1. Надеюсь, это ответит на все ваши вопросы. Если это помогло вам, пожалуйста, проголосуйте, а также примите этот ответ 🙂

2. почему я должен создавать (b) массив?

3. также я попробовал внесенные вами изменения, но это также не сработало

4. Если вы не хотите этого делать, сделайте это b = 0.

5. Я изменил ответ. Пожалуйста, проверьте

Ответ №2:

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

Для линейной регрессии лучше использовать нормальное уравнение, для этого вы можете обратиться к моему репозиторию github https://github.com/tunesh/Linear-Regression/blob/master/linear_regression.py

Комментарии:

1. у вас есть какие-либо идеи, почему стоимость увеличивается?

2. вы обновляете веса для каждого экземпляра (для каждой точки данных) ….. сделайте это для пакета данных.

3. можете ли вы объяснить больше?

4. @TuneshVerma я не согласен со вторым пунктом. Согласно теореме об универсальном приближении, они могут изучать любую функцию.

5. @Ragnar, это было то, о чем я думал, спасибо за разъяснение