객체생성-> 훈련 Fit -> 평가scroe ->predict 반복중
K-최근접 이웃 회귀
*주의 2개의 특성을 이용할때는 자연스럽게 열이 2개인 2차원 배열을 이용했으나, 특성이 1개일때는 수동으로 2차원 배열로 변경해주어야한다.
특성이 1개라 1차원인 상태
reshape() 메서드를 이용하여 2차원 배열로 변경해주었다
결정계수(R^2)
K-최근접 이웃 회귀 알고리즘을 구현한 클래스는 KneighborsRegressor이다.
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()
# k-최근접 이웃 회귀 모델을 훈련합니다
knr.fit(train_input, train_target)
결정계수란?
다음과 같이 점수가 나왔을때, 이를 결정계수 라고 부른다.(또는 R^2)
과대적합 vs 과소적합 (평가 점수 비교)
훈련세트의 점수와 테스트 점수를 비교하였을때,( 보통 훈련 세트의 점수가 더 높은 점수가 나와야한다.)
훈련점수 0.9698 , 테스트점수 0.9928 은 과소적합이라고 할수있다.
이를 해결하기 위해서는 이웃의 개수를 늘려서 데이터 전반에 있는 일반적인 패턴을 반영시킬수있다.
=> 이웃의 적합한 수를 찾는 알고리즘은 5장에서 할 예정
선형 회귀 Linear Regression
k-nn의 한계: 돌연변이 값에 대한 대처가 약하다.
다음과 같이 데이터(초록)가 들어왔을때 평균의 범주와 떨어져 있으면 최근접 데이터가 현실과 차이가 크게 생긴다.
=> 이를 해결하기 위하여 선형 회귀를 사용해야한다.
y=ax+b <<에서 a와 b의 값을 알면 전부 값을 알수있다.
즉, 기울기와 y절편<< 을 찾아야한다.
선형회귀의 목적: 최적의 대각선을 찾자
1. 사이킷런은 sklearn.liner_model 패키지 아래에 LinearRegression 클래스로 선형 회귀 알고리즘을 구현했습니다.
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
perch_length = np.array(
[8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0,
21.0, 21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5,
22.5, 22.7, 23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5,
27.3, 27.5, 27.5, 27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0,
36.5, 36.0, 37.0, 37.0, 39.0, 39.0, 39.0, 40.0, 40.0, 40.0,
40.0, 42.0, 43.0, 43.0, 43.5, 44.0]
)
perch_weight = np.array(
[5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0,
110.0, 115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0,
130.0, 150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0,
197.0, 218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0,
514.0, 556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0,
820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0,
1000.0, 1000.0]
)
# 훈련 세트와 테스트 세트로 나눕니다
train_input, test_input, train_target, test_target = train_test_split(
perch_length, perch_weight, random_state=42)
# 훈련 세트와 테스트 세트를 2차원 배열로 바꿉니다
train_input = train_input.reshape(-1, 1)
test_input = test_input.reshape(-1, 1)
# 선형회귀 알고리즘 객체 생성
lr = LinearRegression()
# 선형 회귀 모델 <훈련>
lr.fit(train_input, train_target)
# 50cm 농어에 대한 예측
print(lr.predict([[50]]))
print(lr.coef_, lr.intercept_)
#시각화
# 훈련 세트의 산점도를 그립니다
plt.scatter(train_input, train_target)
# 15에서 50까지 1차 방정식 그래프를 그립니다
plt.plot([15, 50], [15*lr.coef_+lr.intercept_, 50*lr.coef_+lr.intercept_])
# 50cm 농어 데이터
plt.scatter(50, 1241.8, marker='^')
plt.scatter(50, 1033, marker='x')
#plt.plot([x1,x2], [y1,y2])
plt.plot([15,50],[lr.coef_*15+lr.intercept_, lr.coef_*50+lr.intercept_],'r')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
print(lr.coef_)
print(lr.intercept_)
다항 회귀
선형회귀의 문제점: 그래프의 왼쪽 아래가 직선으로 쭉 가면 0을 뚫어서 -무게가 되어버렸다.
다항 회귀란? 다항식을 사용한 선형 회귀를 다항회귀라고 한다.
짧은 직선을 이어서 그려서 마치 곡선처럼 보이게 한다.
다중 회귀
List->넘파이->판다스로 변경 가능
->바로 판다스로도 가능
다중 회귀 모델을 훈련하기 위해서는 여러개의 특성을 사용하여 선형 회귀를 수행햐아한다.
1. 사이킷런의 LinearRegression 클래스를 임포트하고 앞에서 만든 train_poly를 사용해 모델을 훈련시킨다.
from sklearn.linear+model import LinearRegression
lr=LinearRegression()
lr.fit(train_poly, train_target)
#훈련 세트 데이터 점수 출력
print(lr.score(train_poly,train_target))
#테스트 세트 데이터 점수 출력
print(lr.score(test_poly,test_target))
2. 기존의 특성을 이용하여 또 다른 특성을 만들어 내는 작업(특성 공학)을 통해 신뢰도를 올려야한다.
예) "농어 길이", "농어 높이" , "농어 길이x농어 높이 "
3. 늘어난 데이터를 처리하기 위해서는 그 방법이 매우 까다로운데 이를 처리하기 위해서 판다스(유명한 데이터 분석 라이브러리)를 사용하는것이 좋다.
데이터프레임은 판다스의 핵심 데이터 구조인데, 많은 기능을 제공하고 배열로 쉽게 변경도 가능하다.
'SW 교육' 카테고리의 다른 글
[2024.08.05] 데이터 분석 (0) | 2024.08.05 |
---|---|
[2024.08.02] 특성 공학과 규제 (0) | 2024.08.02 |
[2024.07.31] Numpy를 이용한 배열의 처리 , 데이터 전처리 (0) | 2024.07.31 |
[2024.07.30] 머신러닝 첫구현(knn알고리즘) (0) | 2024.07.30 |
[2024.07.29] 주피터 노트북 사용환경 만들기 (0) | 2024.07.29 |