본문 바로가기

데이터/머신러닝

[혼공] ch 1. 나의 첫 머신러닝

1. 인공지능과 머신러닝, 딥러닝

 

인공지능(artificial intelligence)

- 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술

 

머신러닝(machine learning)

- 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야 

 

딥러닝(deep learning)

- 많은 머신러닝 알고리즘 중에서 인공 신경망(artificial neural network)을 기반으로 한 방법들을 통칭

 

 

2. 코랩과 주피터 노트북

 

구글 코랩(Colab)

- 클라우드 기반의 주피터 노트북 개발환경 

- 머신러닝은 컴퓨터 사양이 중요한데, 구글 코랩을 사용하면 컴퓨터 성능과 상관없이 프로그램을 실습해 볼 수 있음

 

셀(cell)

- 코랩에서 실행할 수 있는 최소단위 

 

 

3. 마켓과 머신러닝

 

1) 생선 분류 문제 

 

분류(classification)

- 여러 개의 종류(클래스) 중 하나를 구별해 내는 문제

- 이진 분류(binaray clssification) : 2개의 클래스 중 하나를 고르는 문제 

 

특성(feature)

- 데이터의 특징

 

도미데이터 준비하기 

bream_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]
bream_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]

 

- 도미 35마리를 2차원 그래프에 점으로 표시 

- 생선의 길이가 길수록 무게가 많이 나감

  -> 산점도 그래프가 일직선에 가까운 형태로 나타나는 선형적(linear)

import matplotlib.pyplot as plt #matplotlib의 pyplot 함수를 plt으로 줄여서 사용

plt.scatter(bream_length, bream_weight)
plt.xlabel('length') #x축은 길이
plt.ylabel('weight') #y축은 무게
plt.show()

 

 

빙어 데이터 준비하기 

smelt_length = [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]
smelt_weight = [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]
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

 

- 빙어도 도미와 비슷하게 길이와 무게가 비례하지만 늘어나는 정도가 조금 다름

- 빙어는 길이가 늘어나더라도 무게가 많이 늘지 않음

- 따라서 빙어의 산점도는 선형적이지만 무게가 길이에 영향을 덜 받는다고 볼 수 있음 

 

 

2) 첫 번째 머신러닝 프로그램 

 

- 도미와 빙어 데이터를 하나의 데이터로 합침 

length = bream_length+smelt_length
weight = bream_weight+smelt_weight

 

 

- 사이킷런 패키지를 사용하려면 각 특성의 리스트를 세로 방향으로 늘어뜨린 2차원 리스트를 만들어야 함 

- zip() 함수는 나열된 리스트 각각에서 하나씩 원소를 꺼내 반환

- for문은 zip() 함수로 length와 weight 리스트에서 원소를 하나씩 꺼내어 l과 w에 할당

fish_data =[[l,w] for l,w in zip(length,weight)]

 

 

 

- 정답 데이터 준비 

- 도미는 1, 빙어는 0

fish_target=[1]*35 + [0]*14
print(fish_target)

 

- 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsClassifier를 임포트 

- 특정 클래스만 임포트하려면 from  ~ import 구문 사용 

from sklearn.neighbors import KNeighborsClassifier

 

 

- 임포트한 KNeighborsClassifier 클래스의 객체를 먼저 만듬

kn=KNeighborsClassifier()

 

- 객체에 fish_data와 fish_target을 전달하여 도미를 찾기 위한 기준을 학습시킴

- 이런 과정을 훈련(training)이라고 부름

- 사이킷런에서의 fit() 메서드는 주어진 데이터로 알고리즘을 훈련

kn.fit(fish_data,fish_target)

 

 

- 객체 kn이 얼마나 잘 훈련되었는지를 평가 

- 사이킷런에서의 score() 메서드는 모델을 평가함

  -> 0에서 1사이의 값을 반환

kn.score(fish_data,fish_target)

정확도

정확도 : 정확한 답을 몇개 맞혔는지를 백분율로 나타낸 값. (정확히 맞힌 개수) / (전체 데이터 개수)

 

 

3) k-최근접 이웃 알고리즘

 

- 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용 

- 새로운 데이터에 대해 예측할 때는 가장 가까운 직선거리에 어떤 데이터가 있는지를 살피기만 하면 됨 

 

plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.scatter(30,600,marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

 

 

- predice() 메서드는 새로운 데이터의 정답을 예측

- 새로운 데이터는 도미 

kn.predict([[30,600]])

 

 

 

- KNeighborsClassifier 클래스의 참고 데이터의 기본값은 5

- 기준은 n_neighbors 매개변수로 바꿀 수 있음 

kn49 = KNeighborsClassifier(n_neighbors=49) #참고 데이터를 49개로 한 kn49 모델
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)

 

- fish_data의 데이터 49개 중에 도미가 35개로 다수를 차지하므로 어떤 데이터를 넣어도 무조건 도미로 예측