Python 파이썬/머신러닝 2019. 11. 21. 21:43

단순회귀분석(Simple Regression Analysis)

회귀분석이란 변수 사이의 인과관계를 증명하는 방법으로 단순회귀분석, 다중회귀분석, 로지스틱 회귀분석 등과 같이 종류가 다양합니다.

 

그 중에서 단순회귀분석은 하나의 독립변수(설명변수)와 하나의 종속변수(반응변수)에 대한 회귀분석을 말합니다.

 

이 블로그에서는 statsmodels 패키지를 사용하여 회귀분석한 것과, 텐서플로우를 사용하여 회귀분석한 것을 둘 다 해보겠습니다.

 

 

우선 statsmodels를 사용하여, 단순회귀분석을 구현해보겠습니다.

 

필요패키지를 가져옵니다.

import pandas as pd
import statsmodels.formula.api as sm

 

그 다음 데이터를 불러옵니다. 저는 가상의 데이터를 불러오겠습니다.

simpledata.csv
0.00MB

df = pd.read_csv('simpledata.csv')

 

이제 회귀 분석을 합니다.

model = sm.ols(formula = 'v2 ~ v1', data = df).fit()
model.summary()

과정에 따라 다르게 적용되지만 적용 기준이 없을 경우, 일반적으로 p값(P>|t| , 유의확률)이 0.05가 넘으면 무의미한 변수라고 하며 단순회귀분석을 할 수 없습니다. Adj.R-squared 는 조정 결정 계수로 0과 1사이에 있으며, 종속 변수와 독립변수 사이에 상관관계(인과관계가 아닙니다)가 높을수록 1에 가까워집니다. 

 

예시로 만든 그림을 보면 회귀식은 y(hat)=0.0991*v1+0.5051 으로 나오며, 만약 v1의 값이 1이라면 v2의 값은 0.6042라고 예측합니다.

 

 

이제 텐서플로우에서 단순회귀분석을 구현해보겠습니다.

 

필요패키지를 불러옵니다.

import pandas as pd
import numpy as np
import tensorflow as tf
import os

 

그 다음 데이터를 불러옵니다. 위에서 사용한 데이터를 다시 불러오겠습니다.

df = pd.read_csv('simpledata.csv')

 

그 후, 두 변수를 다루기 편하도록, 넘파이 행렬로 변환합니다.

data_y = np.array(df.v2)
data_x = np.array(df.v1)

 

이제 본격적으로 텐서플로우를 사용하겠습니다.

 

우선, simplesimple_regresstion 이라는 이름을 가진 그래프를 그립니다.

그 후, 외부데이터를 받아서 저장하는 변수인 placeholder를 그래프에 2개 추가합니다.

다음으로 상수를 정의하는 constant를 그래프에 추가합니다.

학습 중에 계속 변하는 변수인 get_variable을 두 개 추가시킵니다.

여기까지가 선형회귀에 필요한 변수입니다.

 

그 다음으로는 오차를 지정해주며, 이 오차를 줄이기위해 저는 경사하강법(GradientDescent Algorithm)을 사용하였습니다.

with tf.Graph().as_default() as simple_regresstion:
    X = tf.placeholder(tf.float32, [None], name='X')
    Y = tf.placeholder(tf.float32, [None], name='Y')
    lr = tf.constant(1e-3,tf.float32)
    W = tf.get_variable("W",dtype=tf.float32,initializer=tf.constant(1.,tf.float32))
    b = tf.get_variable("b",dtype=tf.float32,initializer=tf.constant(1.,tf.float32))
    
    h = W*X + b
    cost = tf.reduce_mean(tf.square(tf.subtract(h,Y)))
    train = tf.train.GradientDescentOptimizer(lr).minimize(cost)

 

여기까지가 그래프를 그리는 과정입니다.

 

이제 Session을 사용하여 방금 만든 그래프를 불러와 학습을 시킵니다.

with tf.Session(graph = simple_regresstion) as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(2000):
        _,l = sess.run([train,cost],feed_dict={X:data_x,Y:data_y})
        print("cost",l)
    weight, bias = sess.run([W,b])
print(weight, bias)

range에 있는 숫자를 변화시켜 학습횟수를 변경시킬 수 있습니다.

 

print("cost",1) 를 통해 오차가 줄어드는 것을 확인할 수 있으며, print(weight, bias)를 통해 회귀계수를 확인할 수 있습니다.

print(weight*1+bias)

 

예시 데이터로 v1에 1을 넣었을 때, v2는 0.7041902616620064가 나왔습니다.

 

 

이제 텐서플로우로 만든 회귀식을 그래프로 그려보겠습니다.

필요패키지입니다.

import matplotlib.pyplot as plt

 

그래프를 그리는 코드입니다.

plt.scatter(data_x,data_y) 
plt.plot(data_x,data_x*weight+bias,'r') 
plt.show()

찍힌 점들은 실제 데이터 점이며, 그어진 직선이 단순선형회귀를 통해 구해진 모델입니다.

 

posted by 스노(Snow)
:

필요 패키지를 다운로드합니다.

데이터 처리부

데이터 및 타겟을 인코더 및 디코더 합니다.

모델구동기로 만들었던 모델을 불러옵니다.

답변 생성 함수를 만듭니다.

입력 문장 처리(토큰화)함수를 만듭니다.

그 후, 원하시는 스토리로 게임을 제작하시면 됩니다.

 

텍스트 창을 깨끗하게 정리하는 함수 제작

주머니 제작 및 주머니 확인 함수 제작

프롤로그 함수

2번방

 

게임 구동

플레이어가 '주변을 살피다'라고 적으면,

'주변','살피'로 인식되어 rawdata에 있는 데이터들을 검색하여, 같은 토큰으로 인식하는 '주변을 산핀다'의 답변을 불러옵니다. '주변을 살핀다' 의 답변은 0001이며, 답변과 같은 숫자의 이야기를 불러오는 식으로 진행하며, 중복과 랜덤하게 불러오기, 이미지 출력등을 활용하여 플레이어에게 몰입감을 더 줄 수 있게합니다.

posted by 스노(Snow)
:
Python 파이썬/머신러닝 2019. 10. 9. 16:25

정의

기계학습 또는 머신러닝(machine learning)은 애플리케이션을 수정하지 않고도 데이터를 기반으로 패턴을 학습시켜 결과를 예측하는 알고리즘 기법들의 통칭입니다.

 

 

분류

일반적으로 머신러닝은 지도학습과 비지도학습, 강화학습으로 나눠집니다.

 

지도학습 - 데이터에 대한 레이블(명시적인 답)이 주어진 상태에서 컴퓨터를 학습시키는 방법입니다.

              지도학습의 대표적인 머신러닝은 분류와 회귀가 있습니다.

비지도학습 - 데이터에 대한 레이블(명시적인 답)이 주어지지 않은 상태에서 컴퓨터를 학습시키는 방법입니다.

                 비지도학습의 대표적인 머신러닝은 군집화(클러스터링), 차원축소 등이 있습니다.

강화학습 - 현재의 상태에서 어떤 행동을 취하는 것이 최적인지를 학습시키는 방법입니다.

              행동을 취할 때마다 외부 환경에서 보상이 주어지고, 이 보상을 최대화하는 방향으로 학습을 진행시킵니다.

 

오픈 소스 프로그램 언어

머신러닝 프로그램을 작성할 수 있는 대표적인 오픈 소스 프로그램 언어는 파이썬과 R입니다.

C/C++, JAVA 등의 언어도 머신러닝 프로그램 작성이 가능하지만, 파이썬이나 R에 비해 지원 패키지나 개발 생산성이 많이 떨어집니다.

 

머신러닝 분야에서의 R

- 통계 분석을 위해 특화된 언어이며 많은 사용자들이 생성하고 검증해온 다양한 통계 패키지를 보유하고 있습니다. 

- 데이터 시각화 기능이 매우 뛰어납니다.

 

머신러닝 분야에서의 파이썬

- 쉽고 뛰어난 개발 생산성으로 전 세계 개발자들이 파이썬을 선호합니다.

- 인터프리터 언어의 특성상 속도는 느리지만 확장성, 유연성, 호환성이 뛰어나 다양한 영역에서 사용됩니다.

- 딥러닝 프레임워크인 텐서플로, 케라스, 파이토치 등에서 파이썬 우선 정책으로 파이썬을 지원하고 있습니다.

posted by 스노(Snow)
:
Python 파이썬 2019. 10. 9. 13:37

문자열 서식

%d : 정수형

%s : 문자형

%f : 실수형

 

파이썬에서는 서식과 데이터의 자료형이 달라도 에러가 뜨지 않고 자동으로 캐스팅합니다.

여러개의 문자열 서식을 사용할 경우 % 뒤에 괄호로 묶어서 사용합니다.

 

[결과]

[코드]

 

# 문자열 서식
# %d, %s, %f : 정수형. 문자형. 실수형
age = 25
print("나이 : %s" % age) # 파이썬에서는 서식과 데이터의 자료형이 달라도 에러가 뜨지 않고 자동으로 캐스팅
fruit = "포도"
print("좋아하는 과일은 %s 입니다." % fruit)
name = "스노"
print("%s님의 나이는 %s입니다." %(name, age)) # 여러개의 문자열 서식을 사용할 경우 % 뒤에 괄호로 묶어서 사용
rate=98
print("에러율 : %d%%" % rate)
point=3.141592
print("원주율 : %10.3f" %point)

posted by 스노(Snow)
:
Python 파이썬 2019. 10. 9. 13:31

자연수의 계승 또는 팩토리얼은 그 수보다 작거나 같은 모든 양의 정수의 곱을 말합니다.

n이 하나의 자연수일 때, 1에서 n까지의 모든 자연수의 곱입니다.

 

[결과]

[코드]

def fact(n):
    if n == 1:
        return n
    else:
        return n * fact(n-1)
n=int(input())
print(n,"의 팩토리얼")
print(fact(n))

posted by 스노(Snow)
:
Python 파이썬 2019. 10. 9. 13:19

숫자야구게임

사용되는 숫자는 1~9까지의 서로 다른 숫자입니다.

숫자와 위치가 다 맞으면 스트라이크,

숫자만 맞고 위치가 다르면 볼입니다.

어떤 숫자가 볼이고, 어떤 숫자가 스트라이크인지는 알려주지 않습니다.

[결과]

[코드]

import random
# 게임을 위한 랜덤 숫자 생성
ran_num = ["0", "0", "0"]
ran_num[0] = str(random.randrange(1, 9, 1))
ran_num[1] = ran_num[0]
ran_num[2] = ran_num[0]
while (ran_num[0] == ran_num[1]):
    ran_num[1] = str(random.randrange(1, 9, 1))
while (ran_num[0] == ran_num[2] or ran_num[1] == ran_num[2]):
    ran_num[2] = str(random.randrange(1, 9, 1))
 
t_count = 0 # 횟수
s_count = 0 # 스트라이크
b_count = 0 # 볼
 
print("\n")
while ( s_count < 3 ):
    num = str(input("숫자 3개를 입력하세요. ex)123 : "))
    if(num == ""):
        print("\n\n숫자를 입력해주세요. \n\n")
        continue
    if(len(num) != 3):
        print("\n\n숫자 3자리만 입력해주세요.\n\n")
        continue
    if(num.isalpha()):
        print("\n\n문자를 입력할 수 없습니다.\n\n")
        continue
 
    s_count = 0
    b_count = 0
 
    for i in range(0, 3):
        for j in range(0, 3):
            if(num[i] == str(ran_num[j]) and i == j):
                s_count += 1
            elif(num[i] == str(ran_num[j]) and i != j):
                b_count += 1
    print("\n[", s_count, "] 스트라이크! [", b_count, "] 볼!\n")
    t_count += 1
print(t_count, "번 만에 스트라이크!!")

posted by 스노(Snow)
:
Python 파이썬 2019. 10. 9. 13:08

UP & DOWN 게임

1~100 사이의 임의의 숫자를 생성합니다.
사용자가 추측한 후 숫자를 입력하면, 생성된 숫자와 비교하여 up 또는 down을 출력합니다. 
사용자가 생성된 숫자를 맞출때까지 반복해서 동작하도록 구현합니다.

 

[결과]

[코드]

import random
guess = random.randint(1, 100) 
print("숫자(1~100)")
user = int(input())
while (guess is not user):
    if guess>user:
        print("up")
        user = int(input())
    elif guess        print("down") 
        user = int(input())
else:
    print("정답")
    

posted by 스노(Snow)
:
Python 파이썬 2019. 10. 9. 13:04

십진수를 입력받아 2진수로 변환하여 출력하는 프로그램을 구현

 

[결과]

[코드]

 

print("10진수")
x = int(input())
y=""
print("2진수")
while x>0:
    y=str(x%2)+y
    x//=2
print(y)
    

posted by 스노(Snow)
: