문제 1

1. pd.unique(fish[’Species’])와 kn.classes 내의 원소 순서는 동일하다. -> x

2. 로지스틱 회귀는 회귀 모델이다. -> x (분류)

3. 3개 이상의 클래스를 분류하는 다중분류에서 z값을 -1 ~ 1까지의 값으로 바꾸기 위해 소프트 맥스 함수를 사용한다. -> x (0 ~ 1)

4. 소프트 맥스 함수를 사용해 각 클래스의 z값을 0 ~ 1 사이의 값으로 변환한 뒤 다 더하면 1이 된다. -> O

5. 1 epoch는 전체 train_input 데이터에서 1개의 샘플을 뽑아 그 데이터에 대해서 훈련한 것을 의미한다. -> x 전체 데이터 셋에 대해 한번 학습을 종료한 상태

6. K-최근접 이웃 회귀 모델의 훈련결과가 과대적합일 경우 K 값을 줄여 모델을 더 단순하게 만들어야 한다. -> x k값을 늘여 일반화해야 함

7. 시그모이드 함수(sigmoid function)는 0~1까지의 연속적인 형태로 변경하기 위한 함수로 이진분류인 경우 출력이 0.5를 기준으로 높을 경우 양수, 낮을 경우 음수 클래스로 판단한다. -> o

8. partial_fit()메소드를 사용하는 이유는 SGDClassifier에서 효율적으로 한 번에 처리하기 위해서이다. -> x 이미 손실함수가 구해져있을 때, 이어서 훈련하기 위해 사용 (1에포크씩 점진적으로 추가 훈련)

9. round()함수는 기본적으로 소수점 첫째 자리까지 반올림하며, decimals 매개변수로 유지할 소수점 아래 자릿수를 지정할 수 있다. -> x 첫째 자리"에서" 반올림, 정수가 됨

10. 슬라이싱 연산자는 샘플의 차원에 따라서 결과 차원이 결정된다. ex)1차원을 넣으면 1차원이 나온다 -> x

문제 2

틀린내용이 있는 경우 번호를 적어주시고 맞는 내용으로 고쳐주세요

1. 로지스틱회귀의 규제를 강화하려면 매개변수 C를 0에 가깝게 만들어야한다.

    
2. 미니배치를 사용하여 학습하면 배치 경사하강법보다 데이터를 학습시킬때 컴퓨터 자원을 적게 사용한다.
    
3. predict_proba() 메서드는 decision_function() 메서드의 결과값 모두 확률을 계산할 수 있다.
    
4. max_iter= 즉 Epoch 횟수는 Hyper parameter이므로 사용자가 직접 정할 수 있는 값이다.
    
    
5. 로지스틱 회귀로 다중분류를 수행하려면 시그모이드 함수보다 소프트맥스 함수를 사용한다.

-> 1, 3

문제 3

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from scipy.special import expit

df_fish = pd.read_csv('<https://bit.ly/fish_csv_data>')

T = df_fish['Species'].to_numpy()
I = df_fish[['Weight', 'Height', 'Width']].to_numpy()
train_input, test_input, train_target, test_target=train_test_split(I,T, test_size=0.2, random_state=42)

# StandardScaler를 통해 훈련세트를 표준화시키자

ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

# 불리언 인덱싱을 통해 Parkki나 Perch가 있는 행만을 골라내자

boolidx = (train_target=='Parkki') | (train_target=='Perch')
train_Pakki_Perch = train_scaled[boolidx]
target_Pakki_Perch = train_target[boolidx]

print(target_Pakki_Perch[:10])
print('\\n')
lr = LogisticRegression()
lr.fit(train_Pakki_Perch, target_Pakki_Perch)
# 0~9셀까지 로지스틱 선형방정식의 z값을 소수점 셋째자리까지 출력
# 0~9셀까지 z값을 시그모이드 함수를 적용해서 소수점 셋째자리까지 출력

z = lr.decision_function(train_Pakki_Perch[:10]).round(3)
sig = expit(z).round(3)
print(z)
print('\\n')
print(sig)

문제 4

# 실습문제 3번에서 나온 z값과 시그시그모이드 함수 거친 값을 가지고 그래프를 그리고자 한다.
# 위에서 나온 z 와 sig 변수 활용
import matplotlib.pyplot as plt
z_range = np.arange(-5,5, 0.001)

sig_range = expit(z_range)
plt.plot(z_range, sig_range)
plt.scatter(z, sig)
plt.xlabel("z")
plt.ylabel("phi")

plt.show()

문제 5

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDClassifier

# 데이터셋 불러오기
from sklearn.datasets import load_iris
iris = load_iris()

iris_input = iris['data']
iris_target = iris['target']

train_input, test_input, train_target, test_target = train_test_split(
    iris_input, iris_target, random_state=50)

ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

# SGDClassifier에 로지스틱 손실 함수를 적용하고, 최대 10번 반복하게 만들어주세요.(random_state=50를 넣어주세요)
sc=SGDClassifier(loss='log',max_iter=10,random_state=50)
sc.fit(train_scaled,train_target)
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
train_score = []
test_score = []

classes = np.unique(train_target)

# 반복문을 통해 epoch 50회를 진행시켜주세요
# train_scaled와 train_target으로 훈련을 진행시키면 됩니다.
# 그리고 epoch 1회 당 결과값들을 train_score,test_score에 추가해주세요

for _ in range(0,50):
  sc.partial_fit(train_scaled,train_target,classes=classes)
  train_score.append(sc.score(train_scaled,train_target))
  test_score.append(sc.score(test_scaled,test_target))

# matplotplib을 이용하여 그래프 출력해주세요 (xlabel='epoch', ylabel='accuracy')
# train_score와 test_score에 저장되어 있는 점수를 활용하면 됩니다.

plt.plot(train_score)
plt.plot(test_score)
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()

# 각각의 클래스에 해당하는 선형방정식 계수를 출력해주세요
print(sc.coef_,sc.intercept_)