-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPredict the confident to loan using ANN.py
105 lines (82 loc) · 3.13 KB
/
Predict the confident to loan using ANN.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# -*- coding: utf-8 -*-
# Thêm thư viện
import numpy as np
import pandas as pd
# Hàm sigmoid
def sigmoid(x):
return 1/(1+np.exp(-x))
# Đạo hàm hàm sigmoid
def sigmoid_derivative(x):
return x*(1-x)
# Lớp neural network
class NeuralNetwork:
def __init__(self, layers, alpha=0.1):
# Mô hình layer ví dụ [2,2,1]
self.layers = layers
# Hệ số learning rate
self.alpha = alpha
# Tham số W, b
self.W = []
self.b = []
# Khởi tạo các tham số ở mỗi layer
for i in range(0, len(layers)-1):
w_ = np.random.randn(layers[i], layers[i+1])
b_ = np.zeros((layers[i+1], 1))
self.W.append(w_/layers[i])
self.b.append(b_)
# Tóm tắt mô hình neural network
def __repr__(self):
return "Neural network [{}]".format("-".join(str(l) for l in self.layers))
# Train mô hình với dữ liệu
def fit_partial(self, X, y):
A = [X]
# quá trình forward propagation
out = A[-1]
for i in range(0, len(self.layers) - 1):
out = sigmoid(np.dot(out, self.W[i]) + (self.b[i].T))
A.append(out)
# quá trình back propagation
y = y.reshape(-1, 1)
dA = [-(y/A[-1] - (1-y)/(1-A[-1]))]
dW = []
db = []
for i in reversed(range(0, len(self.layers)-1)):
dw_ = np.dot((A[i]).T, dA[-1] * sigmoid_derivative(A[i+1]))
db_ = (np.sum(dA[-1] * sigmoid_derivative(A[i+1]), 0)).reshape(-1,1)
dA_ = np.dot(dA[-1] * sigmoid_derivative(A[i+1]), self.W[i].T)
dW.append(dw_)
db.append(db_)
dA.append(dA_)
# Đảo ngược dW, db
dW = dW[::-1]
db = db[::-1]
# Gradient descent
for i in range(0, len(self.layers)-1):
self.W[i] = self.W[i] - self.alpha * dW[i]
self.b[i] = self.b[i] - self.alpha * db[i]
def fit(self, X, y, epochs=20, verbose=10):
for epoch in range(0, epochs):
self.fit_partial(X, y)
if epoch % verbose == 0:
loss = self.calculate_loss(X, y)
print("Epoch {}, loss {}".format(epoch, loss))
# Dự đoán
def predict(self, X):
for i in range(0, len(self.layers) - 1):
X = sigmoid(np.dot(X, self.W[i]) + (self.b[i].T))
return X
# Tính loss function
def calculate_loss(self, X, y):
y_predict = self.predict(X)
#return np.sum((y_predict-y)**2)/2
return -(np.sum(y*np.log(y_predict) + (1-y)*np.log(1-y_predict)))
def main():
# Dataset bài 2
data = pd.read_csv('D:\\MinhPhuong\ĐH Đại Nam\\Nội dung giảng dạy\\Bải giảng\\Trí tuệ nhân tạo\\Labs\\dataset.csv').values
N, d = data.shape
X = data[:, 0:d-1].reshape(-1, d-1)
y = data[:, 2].reshape(-1, 1)
p = NeuralNetwork([X.shape[1], 2, 1], 0.1)
p.fit(X, y, 10000, 100)
if __name__ == "__main__":
main()