어제 랜덤포레스트로 분석이 안 되던 자료를 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 ===================================

+ Recent posts