데이터분석/분석-지도학습

회귀분석 #사이킷런#넘파이#numpy#scikit-learn

씩씩한 IT블로그 2020. 6. 28. 22:17
반응형

1. 점찍기

x,y점들을 matplot라이브러리를 이용하여 점찍기

# [점그리기]

import matplotlib.pyplot as plt
import numpy as np

# 1. x,y값
X = [8.70153760, 3.90825773, 1.89362433, 3.28730045, 7.39333004, 2.98984649, 2.25757240, 9.84450732, 9.94589513, 5.48321616]
Y = [5.64413093, 3.75876583, 3.87233310, 4.40990425, 6.43845020, 4.02827829, 2.26105955, 7.15768995, 6.29097441, 5.19692852]

plt.scatter(X, Y) # (x, y) 점그리기

plt.show()


# 2. x,y 직선그래프 그리기
beta_0 = 2   # beta_0에 저장된 기울기 값을 조정해보세요. 
beta_1 = 0 # beta_1에 저장된 절편 값을 조정해보세요.

'''
plot([1,2],[3,4])는 (1,3)과 (2,4)를 잇는 직선을 그린다. 
즉 아래의 예시에서는 (0,f(0))과 (10,f(10))을 잇는 직선을 나타낸다.
'''
plt.plot([0, 10], [beta_1, 10 * beta_0 + beta_1], c='r')  
plt.xlim(0, 10) # 그래프의 X축을 설정합니다.
plt.ylim(0, 10) # 그래프의 Y축을 설정합니다.

plt.show()


2. 선형회귀분석(y=ax+b)

# [사이킷런으로 회귀분석]

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression


def loss(x, y, beta_0, beta_1):
    N = len(x)
    lossSum=0
    for i in range(N):
        lossSum+=(Y[i]-(beta_0*X[i]+beta_1))**2
    
    return lossSum
    
X = [8.70153760, 3.90825773, 1.89362433, 3.28730045, 7.39333004, 2.98984649, 2.25757240, 9.84450732, 9.94589513, 5.48321616]
Y = [5.64413093, 3.75876583, 3.87233310, 4.40990425, 6.43845020, 4.02827829, 2.26105955, 7.15768995, 6.29097441, 5.19692852]

# 선형회귀를 위해선 모양을 2차원으로 만들어줘야함.
train_X = np.array(X).reshape(-1,1)
train_Y = np.array(Y)

print(train_X)
print(train_Y)

# 모델학습
lrmodel = LinearRegression() # 회귀분석
lrmodel.fit(train_X, train_Y) # 학습시작


beta_0 = lrmodel.coef_[0]   # 구한 직선의 기울기
beta_1 = lrmodel.intercept_ # 구한 직선의 y절편

print("beta_0: %f" % beta_0)
print("beta_1: %f" % beta_1)
print("Loss: %f" % loss(X, Y, beta_0, beta_1))

plt.scatter(X, Y) # (x, y) 점을 그립니다.
plt.plot([0, 10], [beta_1, 10 * beta_0 + beta_1], c='r') # y = beta_0 * x + beta_1 에 해당하는 선을 그립니다.

plt.xlim(0, 10) # 그래프의 X축을 설정합니다.
plt.ylim(0, 10) # 그래프의 Y축을 설정합니다.

plt.savefig("test.png")
plt.show()

ex) bnc 텍스트 실습

import operator
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib
matplotlib.use('Agg')



def main():
    words = read_data()
    
    words.sort(key=second,reverse=True) # words.txt 단어를 빈도수 순으로 정렬합니다.
    
    #print(words)
    
    # 정수로 표현된 단어를 X축 리스트에, 각 단어의 빈도수를 Y축 리스트에 저장합니다.  
    X = list(range(1, len(words)+1))
    Y = [x[1] for x in words]
    
    # X, Y 리스트를 array로 변환한 후 각 원소 값에 log()를 적용합니다.
    X, Y = np.array(X), np.array(Y)  
    X, Y = np.log(X), np.log(Y)

    
    # 기울기와 절편을 구한 후 그래프와 차트를 출력합니다. 
    slope, intercept = do_linear_regression(X, Y)
    draw_chart(X, Y, slope, intercept)
    
    return slope, intercept

# read_data() - words.txt에 저장된 단어와 해당 단어의 빈도수를 리스트형으로 변환합니다.
def read_data():
    # words.txt 에서 단어들를 읽어, 
    # [[단어1, 빈도수], [단어2, 빈도수] ... ]형으로 변환해 리턴합니다.
    words = []
    f = open("words.txt", 'r')
    while True:
        line = f.readline().strip("\n")
        if not line: break
        indexOfComma=line.index(",")
        words.append([line[:indexOfComma],int(line[indexOfComma+1:])])
    f.close()
    return words

def second(l):
    return l[1]

# do_linear_regression() - 임포트한 sklearn 패키지의 함수를 이용해 그래프의 기울기와 절편을 구합니다.
def do_linear_regression(X, Y):
    # do_linear_regression() 함수를 작성하세요. 
    train_X=np.array(X).reshape(-1,1)
    train_Y=np.array(Y)
    
    lrmodel = LinearRegression() # 회귀분석
    lrmodel.fit(train_X, train_Y) # 학습시작
    
    slope = lrmodel.coef_[0]   # 구한 직선의 기울기
    intercept = lrmodel.intercept_ # 구한 직선의 y절편
    return (slope, intercept)


# draw_chart() - matplotlib을 이용해 차트를 설정합니다.
def draw_chart(X, Y, slope, intercept):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    plt.scatter(X, Y)

    # 차트의 X, Y축 범위와 그래프를 설정합니다.
    min_X = min(X)
    max_X = max(X)
    min_Y = min_X * slope + intercept
    max_Y = max_X * slope + intercept
    plt.plot([min_X, max_X], [min_Y, max_Y], 
             color='red',
             linestyle='--',
             linewidth=3.0)
    
    # 기울과와 절편을 이용해 그래프를 차트에 입력합니다.
    ax.text(min_X, min_Y + 0.1, r'$y = %.2lfx + %.2lf$' % (slope, intercept), fontsize=15)
    
    plt.savefig('chart.png')
    elice_utils.send_image('chart.png')

if __name__ == "__main__":
    main()

 

 

3. 다중회귀분석 

# [다중 회귀분석 , 단항식의 여러 요소들로 구성된 회귀분석]

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import csv

csvreader = csv.reader(open("Advertising.csv"))

x = []
y = []

next(csvreader)
for line in csvreader :
    x_i = [ float(line[1]), float(line[2]), float(line[3]) ]
    y_i = float(line[4])
    x.append(x_i)
    y.append(y_i)

X = np.array(x)
Y = np.array(y)

lrmodel = LinearRegression()
lrmodel.fit(X, Y)

beta_0 = lrmodel.coef_[0] # 0번째 변수에 대한 계수 (페이스북)
beta_1 = lrmodel.coef_[1] # 1번째 변수에 대한 계수 (TV)
beta_2 = lrmodel.coef_[2] # 2번째 변수에 대한 계수 (신문)
beta_3 = lrmodel.intercept_ # y절편 (기본 판매량)

print("beta_0: %f" % beta_0)
print("beta_1: %f" % beta_1)
print("beta_2: %f" % beta_2)
print("beta_3: %f" % beta_3)

def expected_sales(fb, tv, newspaper, beta_0, beta_1, beta_2, beta_3):
    return fb*beta_0+tv*beta_1+newspaper*beta_2+beta_3
    

print("예상 판매량: %f" % expected_sales(10, 12, 3, beta_0, beta_1, beta_2, beta_3))

 

4. 다항 회귀분석 (비선형회귀분석)

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

'''
./data/Advertising.csv 에서 데이터를 읽어, X와 Y를 만듭니다.

X는 (200, 3) 의 shape을 가진 2차원 np.array,
Y는 (200,) 의 shape을 가진 1차원 np.array여야 합니다.

X는 FB, TV, Newspaper column 에 해당하는 데이터를 저장해야 합니다.
Y는 Sales column 에 해당하는 데이터를 저장해야 합니다.
'''
import csv
X=csv.reader(open("Advertising.csv"))
next(X)

# 다항식 회귀분석을 진행하기 위해 변수들을 조합합니다.
X_poly = []
Y=[]
for x_i in X:
    x_i=list(map(float,x_i))
    X_poly.append([
        x_i[1] ** 2, # X_1^2
        x_i[2] , # X_2
        x_i[2] * x_i[3], # X_2 * X_3
        x_i[3] # X_3
    ])
    Y.append(x_i[3])


# X, Y를 80:20으로 나눕니다. 80%는 트레이닝 데이터, 20%는 테스트 데이터입니다.
x_train, x_test, y_train, y_test = train_test_split(X_poly, Y, test_size=0.2, random_state=0)


# x_train, y_train에 대해 다항식 회귀분석을 진행합니다.
lrmodel = LinearRegression()
lrmodel.fit(x_train, y_train)

'''
print(lrmodel.coef_[:])
print(lrmodel.intercept_)
'''

#x_train에 대해, 만든 회귀모델의 예측값을 구하고, 이 값과 y_train 의 차이를 이용해 MSE를 구합니다.
predicted_y_train = lrmodel.predict(x_train)
mse_train = mean_squared_error(y_train, predicted_y_train)
print("MSE on train data: {}".format(mse_train))


# x_test에 대해, 만든 회귀모델의 예측값을 구하고, 이 값과 y_test 의 차이를 이용해 MSE를 구합니다. 이 값이 1 미만이 되도록 모델을 구성해 봅니다.
predicted_y_test = lrmodel.predict(x_test)
mse_test = mean_squared_error(y_test, predicted_y_test)
print("MSE on test data: {}".format(mse_test))

 

반응형