Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- #abc부트캠프 #유클리드소프트 #고용노동부 #대한상공회의소 #미래내일일경험사업
- #abc 프로젝트 멘토링 #유클리드소프트 #고용노동부 #대한상공회의소 #미래내일일경험사업 #공부일지 #멘토링일지
Archives
- Today
- Total
나른한 코딩 생활
[19일차] ABC 부트캠프 머신러닝 - MachinLearning 본문
저번시간에 배웠던 선형회귀 그래프를 여러가지 코딩을 통해 그려보거나
머신러닝의 알고리즘을 간단하게 배워보는 시간을 가져보자
예제 - 붓꽃( Iris )
코드를 살표보기 전에 오늘 사용할 knn - 알고리즘 에 대해 간단한 설명을 하고 넘어가겠다
k-NN 알고리즘에서 k-NN은 k-최근접 이웃k-Nearest Neightbor의 약자로 특정 공간에 분포하는 데이터에 대하여 k개의 가장 가까운 이웃을 살펴보고 다수결 방식으로 데이터의 레이블을 할당하는 분류방식

k개를 살펴본 후 다수결로 정하기 때문에 혹여나 클래스가 동일한 값이 나올 수 있는 짝수(2n)는 k 값에서 사용하지 않는다
아래는 붓꽃( Iris )을 이용한 머신러닝 과정이다
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
print(iris) # dict 형태의 2차원 배열
# row = 4 , # coloumn = 120 이상
# target = 정답
# [5.1, 3.5, 1.4, 0.2] 의 target(정답) 은 0이다
# Iris 라는 붓꽃을 조사해봤는데 이는 3가지 형태로 분류가 된다
# 그 중 4가지 특성을 가지고 있는데 꽃잎과 꽃받힘이라는 속성을 가지고 있다
# 5.1, 3.5 는 길이와 너비
# setosa / versicolor / viginicar 각각 0 / 1 / 2
print(len(iris.get('target'))) # 150
print(len(iris.get('data'))) # 150
(X_train,X_test, y_train, y_test) = train_test_split(iris.data,iris.target,
test_size=0.2,random_state=2024)
print(len(X_train)) # 120
print(len(y_train)) # 120
# 30개는 test 데이터로 사용할 것이다 120개는 train(훈련)할 데이터로 사용하세요
# [ 5.1 , 3.5 , 1.4 , 0.2 ] [w1\n w2\n w3\n w4\n] + b = [0]
print(len(X_test)) # 30
print(len(y_test)) # 30
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=2) # 작을수록 정확 / 클수록 정확도 떨어짐
# 대문자 시작은 보통 클래스, KNeighborsClassifier
# 유클리드_소프트_MachinLearning_강의자료%20-%202024-07-17.pdf : 91pg
# 해당 그림에서 k = 3일때는 동그라미가 많으니 동그라미로 인식 k = 5 일때는 사각형으로 인식
knn.fit(X_train,y_train)
y_pred = knn.predict(X_test)
print(y_pred)
print(y_test) # y 훈련에 참여하지 않은 정답
# y_pred 와 y_test 를 비교시 동일하지 않은 값이 존재하긴 한다
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import numpy as np
iris = load_iris()
print(iris)
X = iris.data # 데이터 // X 가 대문자인 이유는 [] list 형식으로 작성되기 때문이다, tensor 1 = [], tensor 2 [][] 2차원
# 데이터는 지금 column 4 , rot 150 의 2차원 리스트로 이루어져있음
y = iris.target # 정답
# 정답은 지금 1차원 리스트 행 150개로만 이루어져있다
print(X.shape, y.shape)
(X_train, X_test, y_train, y_test) = train_test_split(X, y, train_size=0.8) # == text_size = 0.2
# train -> 훈련 , test -> 테스트 할 것 ( 실험 )
# 150 개중 120개 train 데이터와 120개의 정답을 가지고 훈련 30개 test
# 즉 훈련에 대한 정답 확률(120)과 테스트에 대한 정답 확률(30)을 비교해봄
# 그러나 데이터가 너무 적을 경우에는 train을 전부 시키기도 하나 좋은 방법은 아니다
# -> test 할 data 는 따로 빼놓을 필요가 있다.
#
regression = LinearRegression() # class 객체 regression 을 생성
regression.fit(X=X_train, y=y_train)# key 처럼 X = X_train 가능
# X_train 을 통해 훈련된 정답을 y_train 이라 함 // 120개의 훈련데이터와 120개의 정답
# 내부적으로 0.01로 학습량 조절, 훈련을 계속 한다
regression.coef_ # weight 가중치 = a 기울기
regression.intercept_ # bias Wx + 의 b 즉, y 절편
print(f'가중치: {regression.coef_}')
print(f'바이어스:{regression.intercept_}')
print(f"훈련하면서 맞춘 정답은 : {regression.score(X_test, y_test)}")
# x/120 = 0.93 훈련한 모델의 정답 확률 93%
#print(regression.predict(X=X_test))
#print(regression.predict(np.array([[6.5, 3.1, 4.7, 1.4]])))
y_predicted = regression.predict(X_test)
print(f"내가 예상한 정답은 : {np.round(y_predicted).astype(int)}") # y_predicted 소수점 날리기
print(f"내가 가진 정답은 : {y_test}")
# test 되지 않은 데이터를 가지고 훈련을 해야한다
# 훈련했을때의 정답 비율과 테스트 데이터 와의 정답이 차이가 있을 수 있다
# -> 이 차이점을 과대(과잉)적합 과소적합 등이라 표현
from sklearn.metrics import accuracy_score
rounded_y_predicted = np.round(y_predicted).astype(int)
accuracy_score(y_pred = rounded_y_predicted, y_true = y_test)
print(f'테스트한 모델의 정확도 : {accuracy_score(y_pred = rounded_y_predicted, y_true = y_test)}') # 0.9333
# print(f'100나오나: {accuracy_score(y_pred = y_test, y_true = y_test)}') => 1.0 나옴
# weight 는 컬럼에 관련이 있고 이 가중치는 뉴런이 된다 -> 이는 또다시 유닛이 된다
| ... 가중치: [-0.1555316 -0.01447446 0.26819011 0.56608361] 바이어스:0.27780922072398273 훈련하면서 맞춘 정답은 : 0.9499681780598119 내가 예상한 정답은 : [2 2 1 1 0 1 1 1 0 1 2 1 1 0 0 2 1 1 2 0 0 2 1 2 0 2 0 2 2 0] 내가 가진 정답은 : [2 2 1 1 0 1 1 1 0 1 2 1 1 0 0 2 1 1 2 0 0 2 1 2 0 2 0 2 2 0] 테스트한 모델의 정확도 : 1.0 |
위의 값을 가지고 함수화
# 그림 그리기
from matplotlib import pyplot as plt
plt.plot(rounded_y_predicted, y_test, color='red',linewidth=4)
plt.show()
# 과잉 적합의 예 : 컬럼 수가 많은 경우 => [ 1, 2, 3, 4, 5, 6, 7, --- ]
# 훈련에만 98% , 실전 데이터는 80%
# solve : 제한조건 걸기, 정규화하기
# 과소 적합의 예 : 데이터가 적은 경우
# solve : 데이터 모델 바꾸기 ( 더 많은 데이터 )
# 가장 좋은 것은 부드러운 그래프

예제 - 당뇨병
import matplotlib.pylab as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn import datasets
# 당뇨병 데이터 세트를 적재한다.
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)
print(f'Data:{diabetes_X}') # Matrix X
print(f'Target:{diabetes_y}') # List? or Numpy(배열)
# list 랑 numpy 배열 어떻게 구별하나? ',' 콤마로 나뉘면 list 그게 아니면 배열
# 나이가 0.038~ 값이 나오나? -> 정규화를 통해 값이 변화됐을 확률이 크다
# 정답 == 혈당
# 컬럼이 10개 이상 나옴 -> weight 도 또한 10개 이상 나온다
# 당뇨병 환자만 뽑아낼때
# Matrix 형태의 Tensor가 2로 만들어줘야함
# 하나의 특징(BMI)만 추려내서 2차원 배열로 만든다. BMI 특징의 인덱스가 2이다.
diabetes_X_new = diabetes_X[:, np.newaxis, 2]
print(diabetes_X_new)
print(diabetes_X_new.shape) # 442 * 1 형태의 Matrix , -> 이건 결국 하나의 list 형태
# 학습 데이터와 테스트 데이터를 분리한다.
from sklearn.model_selection import train_test_split
(X_train, X_test, y_train, y_test)= train_test_split(diabetes_X_new, diabetes_y,
test_size=0.15, random_state=0)
# 소괄호는 튜플로 만들기 위함 // *arrays : list or tuple 로 던져줘라
# random_state = 0 으로 설정하면 Data 순서와 동일하게 진행
regression:LinearRegression = LinearRegression() # 객체 생성
regression.fit(X_train, y_train) # regression => 학습 시킨 모델
print(regression.score(X=X_train,y=y_train)) # 0.368314402~
y_predicted = regression.predict(X_test)
print(y_predicted)
print(y_test)
plt.plot(y_predicted,y_test,'.')
plt.plot(y_predicted,y_test,color='blue',linewidth=3)
plt.show()

예제 - 닥스훈트 ? or 사모예드 ?
import matplotlib.pyplot as plt
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
# 닥스훈트의 길이와 높이 데이터
dach_length = [77,78,85,83,73,77,73,80] # list
dach_height = [25,28,29,30,21,22,17,35]
# 사모예드의 길이와 높이 데이터
samo_length = [75,77,86,86,79,83,83,88]
samo_height = [56,57,50,53,60,53,49,61]
# plt.scatter(dach_length,dach_height,c='red',label='Dachshund')
# plt.scatter(samo_length,samo_height,c='blue',marker='^',label='Samoyed')
#
# plt.xlabel('Length')
# plt.ylabel('Height')
# plt.title('Dog size')
# plt.legend(loc='upper left')
# # 그림을 통해 봤을때 서로의 거리가 있어보이더라도 그림이 왜곡되어있을 가능성도 있음
# plt.show()
d_data = np.column_stack((dach_length,dach_height))
d_label = np.zeros(len(d_data))
print(d_label) # [0,0,0,0,0,0,0,0]
# y= wx + b 에서 (75, 25) 값을 넣으면 0 이 나온다 == 닥스훈트
s_data = np.column_stack((samo_length,samo_height))
s_label = np.ones(len(s_data))
print(s_label) # [1,1,1,1,1,1,1,1]
# y^ = w^x + b^ 에서 (75, 56) 값을 넣으면 1이 나온다 == 사모예드
# 새로운 데이터는 2 차원 배열
newdata = [[78,35]] # 내가 알고 싶은 데이터( 어떤 종류의 개인가? )
olddata = [[77,57]] # 기존 데이터 확인용
dog_classes = {0:"Dachshund", 1:"Samoyed"}
k = 3
knn:KNeighborsClassifier = KNeighborsClassifier(n_neighbors=k) # 클래스 , 객체 knn 생성
# 앞에 8 마리는 닥스 ,뒤에 8마리는 사모예드
dogs = np.concatenate((d_data,s_data)) # 16마리 순서로 정해진 개
labels = np.concatenate((d_label,s_label))
knn.fit(X=dogs,y=labels)
y_predict = knn.predict(X=newdata)
print(y_predict)
print(f'새로운 데이터 : {newdata} - 판정결과 : {dog_classes[0]}')
y_predict2 = knn.predict(X=olddata)
print(y_predict2)
print(f'기존 데이터 : {olddata} - 판정결과 : {dog_classes[1]}')

'ABC 부트캠프' 카테고리의 다른 글
| [21일차] ABC 부트캠프 퍼셉트론 & MLP (3) | 2024.07.24 |
|---|---|
| [20일차] ABC 부트캠프 ESG포럼&세미나 2번째 시간 (1) | 2024.07.21 |
| [18일차] ABC 부트캠프 선형회귀 (0) | 2024.07.21 |
| [17일차] ABC 부트캠프 빅데이터 분석 및 기초 통계 & 딥러닝 (4) | 2024.07.20 |
| [16일차] ABC 부트캠프 데이터 수집 시각화 조별 발표 (2) | 2024.07.20 |