어제 랜덤포레스트로 분석이 안 되던 자료를 0~1의 시그모이드 함수로 표현해보기 위해서 신경망(TensorFlow)를 사용해봤다.
데이터와 실행횟수가 많아 거의 하루종일 돌리는데 아직도 결과가 안 나왔다.
출처는 아래의 블로그이다.
ref.
http://gdyoon.tistory.com/11
=================================== Python ===================================
import pandas as pd
import tensorflow as tf
### 데이터 불러오기
# df = pd.read_csv("final.csv", encoding="utf-8")
# df = df.dropna()
#
# ### 학습시킬 데이터를 넣기
# x_data = []
# y_data = []
# i = 1
# for a in range(len(df.test)):
# try:
# for b in range(len(df.columns.values)):
# if b == 0:
# inner_list = []
# inner_list.append(df.ix[a][b])
# if b == len(df.columns.values)-1:
# x_data.append(inner_list[:12])
# y_data.append(inner_list[-1])
# except:
# i += 1
#
# print("데이터 없음: ", i)
# aa = pd.DataFrame(x_data)
# bb = pd.DataFrame(y_data)
# aa.to_csv("aa.csv")
# bb.to_csv("bb.csv")
aa = pd.read_csv("aa.csv")
bb = pd.read_csv("bb.csv")
x_data = [aa.ix[data].values.tolist() for data in range(len(aa["1"]))]
y_data = [bb.ix[data] for data in range(len(bb["0"]))]
print(x_data[:2])
print(y_data[:2])
### 노드 설정하고 weight, output 설정하기
x = tf.placeholder(tf.float32, shape=[None, 11])
y = tf.placeholder(tf.float32, shape=[None, 1])
# input = 12, output = 1
w = tf.Variable(tf.random_normal([11, 1]), name="weight")
# output = 1, bias. 이걸 이용해서 under fit을 예방한다.
b = tf.Variable(tf.random_normal([1]), name="bias")
### 로지스틱스 회귀분석을 위한 시그모이드 함수
# sigmoid function 은 가설이다. H(X) = 1/(1+e^(-w.transpose * X))
# tf.div(1, tf.exp(tf.matmul(X, W) + b)) 와 같음
hypothesis = tf.sigmoid(tf.matmul(x, w) + b)
# 이하 아래의 블로그를 보면서 이해할 필요가 있다.
# http://gdyoon.tistory.com/11
### 경사하강법을 적용한다.
# 새롭게 정의된 오차함수
cost = -tf.reduce_mean(y * tf.log(hypothesis) + (1 - y) * (tf.log(1 - hypothesis)))
# 학습 그래프 최적화 알고리즘 경사하강법
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
# 예측값이 0.5 이상이면 True, 아니면 False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
# 0이나 1의 값을 트레이닝 횟수만큼 평균치 계산
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, y), dtype=tf.float32))
### 그래프를 정의하고 세션을 통해 트레이닝 시킨다. cost값이 감소하는지 관찰한다.
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(10):
cost_val, _ = sess.run([cost, train], feed_dict={x: x_data, y: y_data})
print(step, '\t', cost_val)
# if step % 1000 == 0:
# print(step, '\t', cost_val)
=================================== Python ===================================