k-최근접 이웃 회귀

예측하려는 샘플에 가장 가까운 샘플 k개를 선택하여 샘플의 수치의 평균을 구하여 새로운 예측값을 추정하는 회귀분석법

 

✍🏻회귀 : 두 변수 사이의 상관관계를 분성하는 방법, 임의의 값을 예측하는 분석법

 

데이터 준비

농어의 길이와 무게의 데이터를 준비
1. 사이킷런의 train_test_split() 함수를 사용해서 훈련세트와 테스트 세트로 나누며 샘플링 편향도 쉽게 해결할 수 있다. 2. numpy의 배열의 reshape로 크기를 바꿈

결정계수(R²)

R² = 1 - (타깃 - 예측)² 의 합 / (타깃 - 평균)² 의 합

종속변수의 분산 중에서 독립변수로 설명되는 비율, 모델이 타겟 변수를 얼마나 잘 예측 혹은 설명하는지 평가지표로 사용된다.

예측이 평균값만큼의 예측을 수행한다면 분자와 분모 값이 비슷해져서 결정계수 값이 0에 가까워진다.

예측이 타깃값에 가깝게 예측한다면 분자가 0에 가까워지기 때문에 결정계수 값이 0에 가까워진다.

 

과대적합 vs 과소적합

훈련한 모델의 점수를 산정하였을때 훈련 세트에서 점수가 좋고 테스트 세트에서 점수가 나쁘다면 과대적합

훈련한 모델의 점수를 산정하였을때 테스트 세트에서 점수가 좋고 훈련 세트에서 점수가 나쁘다면 과소적합

  과대적합 과소적합
훈련 세트 훈련 세트 점수 > 테스트 세트 점수 테스트 세트 점수 > 훈련 세트 점수
테스트 세트

✍🏻 과대적합시 새로운 샘플에 대한 예측이 잘 동작하지 않을 가능성이 높음

✍🏻 두 세트의 점수가 모두 너무 낮은 경우에도 과소적합이라고 하며 훈련모델이 단순하여 적절히 훈련되지 않았다고 판단

 

k-최근접 이웃 회귀의 경우 근처 샘플의 갯수 k를 조절하여 훈련하면 모델의 점수를 조절할 수 있다.

✍🏻 과대적합일 경우 n_neighbor 속성값을 늘리고, 과소적합은 반대로 값을 줄여 훈련하면 해결할 수 있다.

✍🏻 데이터의 크기가 크고 정교할수록 더욱 학습에 적합하다.

 

📃미션

Ch. 03(03-1) 2번 문제 출력 그래프 인증샷

 

문제) 과대적합과 과소적합에 대한 이해를 돕기 위해 복잡한 모델과 단순한 모델을 만들겠습니다. 앞서 만든 k-최근접 이웃 회귀 모델의 k 값을 1, 5, 10으로 바꿔가며 훈련해 보세요. 그다음 농어의 길이를 5에서 45까지 바꿔가며 예측을 만들어 그래프로 나타내 보세요. n이 커짐에 따라 모델이 단순해지는 것을 볼 수 있나요?

반복문을 통해 n의 값을 변동하여 모델을 훈련하여 x의 예측값을 구해 그래프를 그린다. (추가로 스코어 점수를 비교하여 단순해지는 것을 명시적으로 확인)
n_neighbor의 값이 증가함에 따라 훈련데이터의 스코어 점수가 점점 내려가고 모델이 단순해짐을 확인

 

선형 회귀

특성이 하나인 경우 해당 특성을 잘 나타낼 수 있는 직선을 학습하는 알고리즘

✍🏻선형 회귀가 찾은 특성과 타깃 사이의 관계는 선형 방정식의 계수 또는 가중치에 저장된다.

 

모델 파라미터

선형 회귀가 찾은 가중치처럼 머신러닝 모델이 특성에서 학습한 파라미터를 말함,

많은 머신러닝 알고리즘의 훈련 과정은 최적의 모델 파라미터를 찾는 것과 같다. (이를 모델 기반 학습이라 한다.)

✍🏻 k-최근접 이웃에서는 모델 파라미터가 없으며 훈련 세트를 저장하는 것이 훈련의 전부였다. (이를 사례 기반 학습이라 한다.)

 

다항 회귀

다항식을 사용하여 특성과 타깃 사이의 관계를 나타낸다. 함수의 그래프가 비선형일 수 있지만 여전히 선형 회귀로 표현 가능

 

규제

머신러닝 모델이 훈련 세트를 너무 과도하게 학습하지 못하도록 훼방하는 것을 말함, 즉 훈련 세트에 과대적합되지 않도록 하는 것

 

릿지 회귀

규제가 있는 선형 회귀 모델, 선형 모델의 계수를 작게 만들어 과대적합을 완화시킨다.

 

라쏘 회귀

릿지와 같이 규제가 있는 선형 회귀 모델, 릿지와 다르게 계수 값을 아예 0으로 만들 수도 있다.

 

📃 선택미션

모델 파라미터에 대해 설명하기

머신러닝 모델이 특성에서 학습한 파라미터를 의미하며 학습된 모델의 능력을 결정하며 학습된 모델의 일부로 저장이 된다.

1️⃣장

 

인공지능

인공지능(Artificial intelligence)은 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술

 

✍🏻 컴퓨터의 서능 한계로 AI 겨울을 거치기도 함

 

머신러닝

머신러닝(Machine learning)은 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야,

인공지능의 하위 분야 중에서 지능을 구현하기 위한 소프트웨어를 담당하는 핵심 분야

머신러닝은 통계학에서 유래된 알고리즘이 많으며 상호 작용하며 발전 중

 

딥러닝

머신러닝 알고리즘 중에 인공 신경망(Artificial neural network)을 기반으로 한 방법들을 통칭하여 딥러닝(Deep learning)이라 함

딥러닝 기술은 복잡한 알고리즘을 훈련할 수 있는 풍부한 데이터, 컴퓨터 성능의 향상, 알고리즘의 발전을 통해 뛰어난 성능을 보이게 됨

 

구글 코랩

웹에서 파이썬 프로그램을 테스트하고 저장할 수 있는 서비스, 클라우드 기반의 주피터 노트북 개발 환경

https://colab.research.google.com/

 

Google Colaboratory

 

colab.research.google.com

 

✍🏻 여기서 노트북은 코랩의 프로그램 작성 단위이며 일반 프로그램 파일과 달리 대화식으로 프로그램을 만들 수 있기 때문에 데이터 분석이나 교육에 매우 적합

 

 

생선의 길이와 무게 데이터를 특성(feature)라 하며 특성을 이용하여 산점도를 그릴 수 있다.

✍🏻 머신러닝에서 여러 개의 종류 혹은 클래스(class)라고 부르는 것 중 하나를 구별해 내는 문제를 분류(classification)이라고 함

✍🏻 특정 데이터를 도미와 빙어라는 2개의 클래스 중 하나로 분류하는 문제는 이진 분류(binary classification)이라고 함

 

 

🐟머신러닝을 사용해 도미와 빙어를 구분 짓고자 한다.

각 생선의 특성을 그래프로 표현하면 데이터를 잘 이해할 수 있고 작업에 대한 힌트를 얻을 수도 있다.

✍🏻 산점도 : x축과 y축의 그래프에 데이터를 점으로 표시하는 그래프

파이썬에서 과학계산용 그래프를 그리는 대표적인 패키지 맷플롭립(matplotlib)을 이용하여 산점도를 구한다.

 

도미의 특성을 이용해 그린 산점도
빙어의 특성을 이용해 그린 산점도
2개의 산점도를 한 그래프로 표현하는 법

 

k-최근접 이웃 (k-Nearest Neighbors) 알고리즘을 사용한 이진 분류

✍🏻 k-최근접 이웃 알고리즘 : 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용(주변 값)

 

도미와 빙어 데이터를 2차원 배열로 준비하여 사이킷런(scikit-learn) 패키지를 이용하여 이진 분류를 수행한다.

도미와 빙어의 특징이 담긴 2차원 배열 준비
2차원 배열의 각각 특성을 도미인지 빙어인지 구분하는 target 배열

 

fish_data 와 fish_target을 사용하여 훈련을 수행하여 모델 kn을 평가한다.

모델 kn의 score 메서드 값은 1.0, 즉 모든 데이터를 맞추었다.
길이 30센치, 600그램의 생선은 도미로 판단하였다.

 

kn 모델은 훈련시에 전달한 모든 데이터를 가지고 있다가 새로운 데이터가 등장하면 가장 가까운 데이터를 참고하여 도미인지 빙어인지 구분한다.

 

가까운 데이터의 참고갯수는 n_neighbors 매개변수로 변경 가능 (기본값은 5이다.)

가장 가까운 데이터 49개를 사용하는 모델에선 도미만 올바르게 맞추어 정확도가 매우 떨어진다.

 

 

 

2️⃣장

 

샘플링 편향으로 정확도가 0을 도출

넘파이 라이브러리를 활용하여 랜덤하게 샘플을 선택해 훈련 세트와 테스트 세트를 만든다.

 

변수(variable)란 값을 저장할 수 있는 메모리상의 공간

 

메모리상의 공간의 값은 변경 될 수 있다.


int example = 0;

int라는 변수타입, example이라는 변수명, 변수의 값 0으로 선언


변수의 이름을 짓는 법엔 몇가지 규칙을 지켜야 한다. (변수의 명명규칙)

1. 예약어를 사용해서는 안 된다.

 - 예약어는 keyword 또는 reserved word라고 하며 프로그래밍언어의 구문에 사용되는 단어를 뜻한다.

   따라서 변수명으로 이용될 경우 프로그래밍의 구문에서 사용되는 명령이나 단어인지 변수명인지 구분할 수 없다.

 

2. 대소문자가 구분되며 길이에 제한이 없다.

 - example과 Example은 서로 다른 것으로 대소문자를 구분하여 인식한다.

 

3. 숫자로 시작해서는 안 된다.

 - example123 (가능) <-----> 123example (불가능)

 

4. 특수문자는 '_'와 '$'만을 허용한다.

 - _example, test_Example, $xample (가능) <-----> %example, test^Example, !xample (불가능)


변수의 종류(type)에 따라 값이 저장될 공간의 크기와 저장형식이 달라지도록 정의한 것이 자료형(data type)이다.

 

1. 기본형 변수(primitive type)

 기본형 변수는 실제 값을 변수에 저장한다.

 실제 값이 저장되어 있기 때문에 연산에서 사용되는 모든 변수들은 기본형 변수이다.

 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)

 

2. 참조형 변수(reference type)

 참조형 변수는 값이 저장되어 있는 메모리의 주소값을 변수에 저장한다.

 기본형 변수 8개를 제외한 나머지 타입

JSTL(Jsp Standard Tag Library)이란?

JSP문서에 view 영역의 코드를 단순화 시키기 위한 태그 라이브러리

 

표준 액션태그로 처리하기 힘든 부분을 담당(즉 연산, 조건, 반복 등을 편하게 처리)

 

1. Core 태그

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

실행 흐름의 제어 기능을 제공한다.

prefix인 c를 통해 접근 가능

태그 이름 설명 속성
<c:set></c:set> JSP에서 사용될 변수 설정 value, target, property, var, scope
<c:remove></c:remove> 설정한 변수를 제거 var(필수), scope
<c:out></c:out> 변수의 출력 value(필수), escapeXml, default
<c:catch></c:catch> 예외 발생시 EL 변수에 저장 var
<c:if></c:if> 조건문(if), else는 존재하지 않는다. test(필수), var, scope
<c:choose></c:choose> 조건문(switch)  
<c:when></c:when> 조건문(switch)의 case test(필수) 
<c:otherwise></c:otherwise> 조건문(switch)의 default  
<c:forEach></c:forEach> 반복문 var(필수), items(필수), begin, end, step, varStatus
<c:forTokens></c:forTokens> 구분자로 분할해서 반복문 delims(필수), 나머진 forEach와 동일
<c:url></c:url> URL 생성 value(필수), context, var, scope
<c:param></c:param> 파라미터 추가 name, value
<c:import></c:import> 페이지 첨부 url, var, scope. varReader, context, charEncoding
<c:redirect></c:redirect> URL 이동 url(필수), context
<!-- 속성값을 이용한 사용예제 -->

<c:forEach var="사용할 변수명" items="Collection 객체(List, Map 등)" 
	begin="반복시작 index, 기본값은 0" end="반복종료 index" 
    step="반복할 때마다 건너 뛸 index 갯수" varStatus="반복상태">
</c:forEach>
		
<c:forTokens var="사용할 변수명" items="Collection 객체(List, Map 등)"
	delims="문자열 분리를 위한 특정 기호"
	begin="반복시작 index, 기본값은 0" end="반복종료 index" 
    step="반복할 때마다 건너 뛸 index 갯수" varStatus="반복상태">
</c:forTokens>
		
<c:url value="url" context="/다음에 오는 로컬 어플리케이션의 이름" 
	var="처리된 url을 표시할 변수" scope="처리된 url을 노출하는 범위">
</c:url>
		
<c:param name="파라미터의 이름" value="파라미터의 값"></c:param>
		
<c:import url="URL값" var="리소스가 저장되는 변수명" scope="var 속성의 범위" 
	varReader="리소스가 저장될 Reader객체 변수" context="URL에 접근할 때 컨텍스트 이름" 
    charEncoding="리소스를 가져올때 인코딩 방법"></c:import>
		
<c:redirect url="사용자 브라우저에서 리다이렉트하는 URL" 
	context="/다음에 오는 로컬 웹 응용 프로그램의 이름"></c:redirect>

 

 

2. Formatting 태그

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

숫자, 날짜, 시간을 지정된 형식으로 formatting한다.

국제화, 다국어 지원 기능

속성 타입 설명 필수여부 기본값
value java.util.Date 표시할 입력값(Date) 필수  
type String 시간, 날짜 혹은 둘 다인지 지정   date
dateStyle String 미리 정의된 날짜 형식, java.text.DateFormat문법을 따른다.    
timeStyle String 미리 정의된 시간 형식    
pattern String 사용자 지정 형식 스타일    
timeZone String 또는 java.util.TimeZone 형식화 시간에 나타날 타임 존    
var String 형식 출력 결과 문자열을 담는 scope에 해당하는 변수명    
scope String var의 scope    

 

3. Database

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

DB의 데이터에 관한 CRUD기능

 

4. XML

<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>

XML 문서 처리 기능

 

5. Function

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

문자열을 제공하는 함수를 쓸 수 있다.

 

참고:

http://www.devkuma.com/books/23

 

프로그램 개발 지식 공유, devkuma

데브쿠마는 프로그래밍 개발에 대한 지식을 공유합니다.

www.devkuma.com

https://hunit.tistory.com/203

 

Jsp〃[EL]과 [JSTL] 한방에 정리 + Core

JSP파일에 자바형식의 코드를 사용하면 불편한 점을 한방에 해결할 수 있는 EL (Expression Language) 과 JSTL (Jsp Standard Tag Library)를 이용해 코드를 간결하게 사용하는 방법에 대해 포스팅하도록 하겠습..

hunit.tistory.com

+ Recent posts