21.12.19 모의테스트

2021. 12. 19. 21:56작업/머신러닝

#1 Numpy 배열 성분

import numpy as np

def solution():
    prime = [2, 3, 5, 7, 11]
    
    # 소수(prime number)를 기반으로 2차원 배열을 생성해보세요.
    matrix = np.array(prime)
    
    # 배열 matrix의 대각(diagonal) 성분을 추출해보세요.
    matrix_dia = np.diag(matrix,k=0)
    print(matrix_dia)

    # 대각 성분의 합과 평균을 구해보세요.
    dia_sum = np.sum(matrix_dia)
    dia_mean = np.mean(matrix_dia)

    return matrix, dia_sum, dia_mean

#출력을 위한 함수입니다. 
def print_answer(**kwargs):
    for key in kwargs.keys():
        print(key,":", kwargs[key])

matrix, dia_sum, dia_mean = solution()

print_answer(matrix=matrix, dia_sum=dia_sum, dia_mean=dia_mean)

 

#2 

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
csvreader = csv.reader(open('data/Advertising.csv'))
X=[]
Y=[]

next(csvreader)
for line in csvreader:
    # print(line)
    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)


# 다항식 회귀분석을 진행하기 위해 변수들을 조합합니다.
X_poly = []
for x_i in X:
    X_poly.append([
        x_i[0] ** 2, # X_1^2
        x_i[1], # X_2
        x_i[1] * x_i[2], # X_2 * X_3
        x_i[2] # X_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)

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

lrmodel.coef_[0]= 0.00013709848099790274
lrmodel.coef_[1]=0.1943179287609083
lrmodel.coef_[2]=-4.1299807187801985e-06
lrmodel.intercept_=5.2611214849579126

#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))

#3 

import numpy as np
import elice_utils
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use("Agg")
eu = elice_utils.EliceUtils()
learning_rate = 1e-4
iteration = 10000

x = np.array([[8.70153760], [3.90825773], [1.89362433], [3.28730045], [7.39333004], [2.98984649], [2.25757240], [9.84450732], [9.94589513], [5.48321616]])
y = np.array([[5.64413093], [3.75876583], [3.87233310], [4.40990425], [6.43845020], [4.02827829], [2.26105955], [7.15768995], [6.29097441], [5.19692852]])

##입력값(x)과 변수(a,b)를 바탕으로 예측값을 출력하는 함수를 만들어 봅니다.
def prediction(a,b,x):
    #1.Numpy 배열 a,b,x를 받아서 'x*(transposed)a + b'를 계산하는 식을 만듭니다.
    equation = x*a + b
    return equation

##변수(a,b)의 값을 어느정도 업데이트할 지를 정해주는 함수를 만들어 봅니다.
def update_ab(a,b,x,error,lr):
    ## a를 업데이트하는 규칙을 만듭니다..
    delta_a = -(lr*(2/len(error))*(np.dot(x.T, error)))
    ## b를 업데이트하는 규칙을 만듭니다.
    delta_b = -(lr*(2/len(error))*np.sum(error))
    
    return delta_a, delta_b

# 반복횟수만큼 오차(error)를 계산하고 a,b의 값을 변경하는 함수를 만들어 봅니다.
def gradient_descent(x, y, iters):
    ## 초기값 a= 0, b=0
    a = np.zeros((1,1))
    b = np.zeros((1,1))    
    
    for i in range(iters):
        #2.실제 값 y와 prediction 함수를 통해 예측한 예측값의 차이를 error로 정의합니다.
        y_pred = prediction(a,b,x)
        error = np.mean(np.square(y - y_pred)
        #3.위에서 정의한 함수를 이용하여 a와 b 값의 변화값을 저장합니다.
        a_delta, b_delta = update_ab(a,b,x,error,lr)
        ##a와 b의 값을 변화시킵니다.
        a -= a_delta
        b -= b_delta
    
    return a, b

##그래프를 시각화하는 함수입니다.
def plotting_graph(x,y,a,b):
    y_pred=a[0,0]*x+b
    plt.scatter(x, y)
    plt.plot(x, y_pred)
    plt.savefig("test.png")
    eu.send_image("test.png")

##실제 진행 절차를 확인할 수 있는 main함수 입니다.
def main():
    a, b = gradient_descent(x, y, iters=iteration)
    print("a:",a, "b:",b)
    plotting_graph(x,y,a,b)
    return a, b

main()

 

'작업 > 머신러닝' 카테고리의 다른 글

22.01.13 텐서플로우와 딥러닝  (0) 2022.01.13
22.01.12 딥러닝 개론  (0) 2022.01.12
21.12.18 나이브베이즈 분류  (0) 2021.12.19
21.12.18 회귀분석  (0) 2021.12.19
21.12.18 선형대수 / Numpy  (0) 2021.12.19