开发神经网络来预测Python的出勤率

时间:2018-06-12 19:49:53

标签: python machine-learning neural-network prediction

我是机器学习和神经网络的新手。我跟着https://www.analyticsvidhya.com/blog/2017/05/neural-network-from-scratch-in-python-and-r/来了解我在看什么。

我的目标是根据温度,工作日/周末,下雨,风暴,假日,公司活动等事项来预测商店的出勤率。

我认为我可以把大部分分解为0或1,例如0周末,没有下雨,没有风暴,没有假期,没有事件,1个工作日,下雨,风暴,事件,假期

对于温度,我尝试使用T-T0 / T1-T0进行标准化,大约是该区域的最高和最低温度

我遇到的一些问题是示例中给出的代码总是返回介于0或1之间的代码,这让我觉得我必须将输出(出勤率)标准化。我尝试的方式与我做的相同温度,但预测最小和最大是困难的,即使使用0和荒谬的像5000(平均约1100)NN没有给出正确的值

我假设这与Sigmoid函数有关,我可能需要使用不同的激活函数,但我仍然是新手,很容易忽略其他东西

示例数据:

Temp: 104
Rain: 0
Holiday: 0
Weekday: 1
Attendance: 410

Temp: 106
Rain: 0
Holiday: 0
Weekday: 0
Attendance: 2338

Temp: 88
Rain: 1
Holiday: 0
Weekday: 1
Attendance: 361

我最近的代码(我回到原版,因为我的编辑导致它的表现更差)

import numpy as np

#Input array
X=np.array([[.88,1,1,1],[.92,0,0,0],[.56,1,1,1]])

#Output
y=np.array([[410],[2338],[361]])

#Sigmoid Function
def sigmoid (x):
    return 1/(1 + np.exp(-x))

#Derivative of Sigmoid Function
def derivatives_sigmoid(x):
    return x * (1 - x)

#Variable initialization
epoch=25000 #Setting training iterations
lr=0.1 #Setting learning rate
inputlayer_neurons = X.shape[1] #number of features in data set
hiddenlayer_neurons = 3 #number of hidden layers neurons
output_neurons = 1 #number of neurons at output layer

#weight and bias initialization
wh=np.random.uniform(size=(inputlayer_neurons,hiddenlayer_neurons))
bh=np.random.uniform(size=(1,hiddenlayer_neurons))
wout=np.random.uniform(size=(hiddenlayer_neurons,output_neurons))
bout=np.random.uniform(size=(1,output_neurons))

for i in range(epoch):

    #Forward Propogation
    hidden_layer_input1=np.dot(X,wh)
    hidden_layer_input=hidden_layer_input1 + bh
    hiddenlayer_activations = sigmoid(hidden_layer_input)
    output_layer_input1=np.dot(hiddenlayer_activations,wout)
    output_layer_input= output_layer_input1+ bout
    output = sigmoid(output_layer_input)

    #Backpropagation
    E = y-output
    slope_output_layer = derivatives_sigmoid(output)
    slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)
    d_output = E * slope_output_layer
    Error_at_hidden_layer = d_output.dot(wout.T)
    d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
    wout += hiddenlayer_activations.T.dot(d_output) *lr
    bout += np.sum(d_output, axis=0,keepdims=True) *lr
    wh += X.T.dot(d_hiddenlayer) *lr
    bh += np.sum(d_hiddenlayer, axis=0,keepdims=True) *lr

print output

预测这个的好方法是什么?我需要改革我的NN还是这个例子足够吗?

1 个答案:

答案 0 :(得分:0)

你的假设是对的。 sigmoid函数始终返回0到1之间的值。 显然,当你处理回归问题(而不是分类)时,这对你来说不是一个好的解决方案。

完全放弃激活功能,改为使用线性函数。

  ...
  hiddenlayer_activations = hidden_layer_input
  ...