# 제출용 종합

문제 1

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

  정답 : (X) 타깃 값을 사이킷런 모델에 전달하면 알파벳 순으로 매겨짐 

---

2. 로지스틱 회귀는 회귀 모델이다. 

  정답 : (X) Classification 

---

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

---

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

  정답 : (O)
---

5. 1 epoch는 전체 train_input 데이터에서 1개의 샘플을 뽑아 그 데이터에 대해서 훈련한 것을 의미한다.

  정답 : (X) 전체 train set을 한번 모두 사용하는 과정을 epoch 라 한다.

---

6. K-최근접 이웃 회귀 모델의 훈련결과가 과대적합일 경우 K 값을 줄여 모델을 더 단순하게 만들어야 한다.
  
  정답 : (X) K값을 줄이면 모델이 더 복잡해지고, 이는 과소적합의 해결책이다.

---

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

  정답 : (X) 양성, 음성 클래스로 판단한다.

---

8. partial_fit()메소드를 사용하는 이유는 SGDClassifier에서 효율적으로 한 번에 처리하기 위해서이다.

  정답 : (X) 한번에 처리하는 것이 아니라, 부분적으로 처리한다.
---

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

  정답 : (O)
---

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

  정답 : (X) 항상 2차원으로 나온다

문제2

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

  정답 : (X) C값은 항상 양수여야한다   

---

    
2. 미니배치를 사용하여 학습하면 배치 경사하강법보다 데이터를 학습시킬때 컴퓨터 자원을 적게 사용한다.

  정답 : (O) 
---

    
    
3. decision_function() 메서드는 predict_proba() 메서드의 결과값 모두 z값을 계산해줄 수 있다.
    
  정답 : (X) z값은 decision_function만 계산가능  predict_proba()는 각 클래스에 속할 확률값계산.
---

4. max_iter= 즉 Epoch 횟수는 Hyper parameter이므로 사용자가 직접 정할 수 있는 값이다.
    
  정답 : (O)
---

    
5. 로지스틱 회귀로 다중분류를 수행하려면 시그모이드 함수보다 소프트맥스 함수를 사용한다.

  정답 : (O)

문제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를 통해 훈련세트를 표준화시키자
from sklearn.preprocessing import 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])
sig = expit(z)
print(np.round(z,3))
print('\\n')
print(np.round(sig,3))

# 0~9셀까지 로지스틱 선형방정식의 z값을 소수점 셋째자리까지 출력
# 0~9셀까지 z값을 시그모이드 함수를 적용해서 소수점 셋째자리까지 출력

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

문제4

# 실습문제 3번에서 나온 z값과 시그시그모이드 함수 거친 값을 가지고 그래프를 그리고자 한다.
# 위에서 나온 z 와 sig 변수 활용
import matplotlib.pyplot as plt
z_range = np.arange(-5,5, 0.001)
phi = 1/(1+np.exp(-z_range))
plt.plot(z_range,phi)
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에 추가해주세요

train_score = []
test_score = []
for i in range(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_)