들어가기 앞서
2주차 과제는 수업시간에 실습한 내용을 바탕으로 진행됩니다.
단순히 코드를 옮겨 적는 것이 아니라, 각 코드가 머신러닝 과정의 어떤 단계에 해당하는지를 이해해 주세요.
먼저, 수업시간에 작성한 코드를 그대로 실행하여 전체 흐름을 다시 확인해주세요.
이후, 제공된 코드 아래에 이어서 직접 코드를 작성하며 과제를 수행해주세요.
모르는 부분이 생긴거나 궁금하다면 디스코드 #정규스터디-질문방 에 질문해주세요!
강의 녹화본
토요일 공지 예정
과제
목표
•
수업시간의 내용을 직접 실습을 통해 익혀보아요.
•
데이터를 다양한 비율로 훈련/테스트로 나누고, 직접 평균·표준편차를 계산해 스케일링한 뒤 KNN 성능과 데이터 분포를 확인해보아요.
제출해야 할 파일
AI_정규_2주차.ipynb & wil.md
•
AI_정규_2주차.ipynb - 코드 (실습 + 과제)
•
wil.md- 배운 점 & 느낀 점 (300자 이상)
과제 명세서 - AI_정규_2주차.ipynb
수업시간에 실습한 내용과 과제를 하나의 파일 AI_정규_2주차.ipynb에 작성하여 제출해주세요.
수업시간 내용 실습
fish_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0,
31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0,
35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0, 9.8,
10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
fish_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0,
500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0,
700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7,
7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
Python
복사
fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target=[1]*35+[0]*14
Python
복사
print(fish_data)
print(fish_target)
Python
복사
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
Python
복사
print(fish_data[4])
Python
복사
train_input = fish_data[:35]
train_target = fish_target[:35]
test_input = fish_data[35:]
test_target = fish_target[35:]
Python
복사
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
Python
복사
import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
Python
복사
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)
Python
복사
print(index)
Python
복사
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
Python
복사
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
Python
복사
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Python
복사
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
Python
복사
fish_data = np.column_stack((fish_length,fish_weight))
print(fish_data[:5])
Python
복사
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
Python
복사
print(fish_target)
Python
복사
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, random_state=42)
Python
복사
print(train_input.shape, test_input.shape)
print(train_target.shape, test_target.shape)
Python
복사
print(test_target)
Python
복사
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify=fish_target, random_state=42)
Python
복사
print(test_target)
Python
복사
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
Python
복사
print(kn.predict([[25, 150]]))
Python
복사
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 150, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Python
복사
distances, indexes = kn.kneighbors([[25, 150]])
Python
복사
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 150, marker='^')
plt.scatter(train_input[indexes,0], train_input[indexes,1], marker='D')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Python
복사
print(train_input[indexes])
print(train_target[indexes])
print(distances)
Python
복사
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 150, marker='^')
plt.scatter(train_input[indexes,0], train_input[indexes,1], marker='D')
plt.xlim((0, 1000))
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Python
복사
mean=np.mean(train_input, axis=0)
std=np.std(train_input, axis=0)
Python
복사
print(mean, std)
Python
복사
train_scaled=(train_input-mean)/std
Python
복사
plt.scatter(train_scaled[:,0], train_scaled[:,1])
plt.scatter(25, 150, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Python
복사
new=([25,150]-mean)/std
plt.scatter(train_scaled[:,0],train_scaled[:,1])
plt.scatter(new[0], new[1], marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Python
복사
kn.fit(train_scaled,train_target)
Python
복사
test_scaled=(test_input-mean)/std
Python
복사
kn.score(test_scaled, test_target)
Python
복사
print(kn.predict([new]))
Python
복사
distances,indexes=kn.kneighbors([new])
plt.scatter(train_scaled[:,0],train_scaled[:,1])
plt.scatter(new[0],new[1],marker='^')
plt.scatter(train_scaled[indexes,0],train_scaled[indexes,1],marker='D')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Python
복사
위 내용까지는 수업시간에 실습한 내용입니다.
아래부터는 과제에 해당하므로, 이어서 셀을 추가하여, 코드를 직접 작성해주세요.
과제
'''
전체 훈련 데이터는 실습에서 사용한 데이터를 그대로 사용해주세요
먼저 전체 훈련 데이터를 훈련세트와 테스트 세트로 분리를 해볼겁니다
실습에서도 분리를 해보았지만 이번에는 우리가 원하는 비율로 분리를 해보겠습니다
Q1. test_size 파라미터를 사용해 7:3으로 데이터를 분리해봐요
Q2. 5:5로 분리해봐요
Q3. 9:1로 분리해봐요
Q4. 위의 1, 2, 3번의 결과로 분리가 잘되었는지 훈련 세트와 테스트 세트를 구성하는 샘플의 개수를 출력해봐요
ex)
[7:3 비율] 훈련 세트: ?개, 테스트 세트: ?개
[5:5 비율] 훈련 세트: ?개, 테스트 세트: ?개
[9:1 비율] 훈련 세트: ?개, 테스트 세트: ?개
'''
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 데이터 합치기 (작성하신 코드)
import numpy as np
fish_data = np.column_stack((fish_length, fish_weight))
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
# Q1. test_size 파라미터를 사용해 7:3으로 데이터를 분리해봐요
train_input_7, test_input_7, train_target_7, test_target_7 =
# Q2. 5:5로 분리해봐요
train_input_5, test_input_5, train_target_5, test_target_5 =
# Q3. 9:1로 분리해봐요
train_input_9, test_input_9, train_target_9, test_target_9 =
# Q4. 위의 1, 2, 3번의 분리 결과로 KNN 알고리즘의 정확도를 테스트 해봐요
kn = KNeighborsClassifier()
# 7:3 분리 결과 확인 (hint: len() 사용)
# 5:5 분리 결과 확인 (hint: len() 사용)
# 9:1 분리 결과 확인 (hint: len() 사용)
Python
복사
'''
앞에서 여러 비율로 테스트 세트와 훈련세트를 분리하고 KNN 알고리즘의 정확도를 테스트 해봤는데요
그중에서 7:3 비율로 나눈 훈련세트와 테스트 세트를 사용하겠습니다
훈련세트와 테스트 세트를 분리했으니 이제 축의 스케일을 맞춰줘야합니다
실습에서는 numpy 라이브러리를 사용해서 평균과 표준편차를 구했는데
이번에는 nupmy 라이브러리를 사용하지 않고 직접 평균과 표준편차를 구해보겠습니다
'''
# 과제: Numpy 없이 순수 파이썬으로 표준점수 스케일링하기
lengths = [fish[0] for fish in train_input]
weights = [fish[1] for fish in train_input]
n = len(train_input)
# Q1. sum() 함수를 이용해 길이와 무게의 평균을 구하세요.
mean_length = # 코드를 작성하세요
mean_weight = # 코드를 작성하세요
# Q2. for문과 ** 연산자를 이용해 길이와 무게의 분산을 구하세요.
# 힌트: 분산 = (각 데이터 - 평균)의 제곱의 합 / 데이터 개수
var_length = # 코드를 작성하세요
var_weight = # 코드를 작성하세요
# Q3. 분산에 제곱근을 씌워 표준편차를 구하세요. ( ** 0.5 이용 )
std_length = # 코드를 작성하세요
std_weight = # 코드를 작성하세요
# Q4. 구해진 평균과 표준편차를 이용해 train_input의 모든 데이터를 스케일링하여 새로운 리스트에 담으세요.
train_scaled_manual = []
for fish in train_input:
# 코드를 작성하세요 ( append 활용 )
# 확인용 평균과 표준편차 출력
print(f"수동 계산 평균: {mean_length:.2f}, {mean_weight:.2f}")
print(f"수동 계산 표준편차: {std_length:.2f}, {std_weight:.2f}")
print(f"스케일링된 첫 데이터: {train_scaled_manual[0]}")
Python
복사
import matplotlib.pyplot as plt
# 1. 스케일링된 2차원 리스트에서 길이(X축)와 무게(Y축) 데이터 분리하기
scaled_lengths = # 코드를 작성하세요
scaled_weights = # 코드를 작성하세요
# 2. 산점도 그리기
# 코드를 작성하세요
Python
복사
과제 명세서 - wil.md
•
2주차 수업을 통해 배운 점 혹은 느낀 점을 작성해주세요.
마감 기한
04월 02일 (목) 23:59까지
제출 방법
자신의 레포지토리에 weekn 폴더를 생성해 .ipynb파일과 wil.md 파일을 제출합니다.
더 자세한 사항은 아래 링크를 참조해주세요.

