servlet 버전을 3.1로 올려야 한다

 

서블릿 3.1버전으로 올리기

https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/3.1.0

 

 

 

 

 

 

 

 

테이블 생성

 

create table tbl_member (
    userid          varchar2(50)        not null,
    userpw          varchar2(50)        not null,
    username        varchar2(50)        not null,
    email           varchar2(100),
    regdate         timestamp           default sysdate, -- sysdate : 서버의 시간
    updatedate      timestamp           default sysdate,
    primary key(userid)
);

 

 

멤버 dto 생성

package com.smart.hrd.domain;

import java.security.Timestamp;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@AllArgsConstructor
@NoArgsConstructor
@Data
public class MemberDTO {
	
	private String userid;
	private String userpw;
	private String username;
	private String email;
	private Timestamp regdate;
	private Timestamp updatedate;
}

 

패키지추가 - persistence 

 

 

persistence  안에 인터페이스 추가 - IMemberDAO

package com.smart.hrd.persistence;

import com.smart.hrd.domain.MemberDTO;

public interface IMemberDAO {
	
	// 실체가 없는
	// 강제성이 있다.
	public String getTime();
	public void insertMember(MemberDTO mDTO);
	
	
}

 

 

 

 

 

 

 

resources > mappers > memberMapper.xml 생성

 

 

 

 

 

 

 

접속

https://mybatis.org/mybatis-3/ko/getting-started.html

 

 

 

 

 

root-context.xml > sqlSessionFactory bean > property 추가

 

<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>

패키지 생성

 

MemberDAOImpl 클래스 생성 (구현체)

 

 

 

package com.smart.hrd.persistence.impl;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.smart.hrd.domain.MemberDTO;
import com.smart.hrd.persistence.IMemberDAO;

// @Repository : DAO객체를 스프링에 인식시키기 위해서 사용
@Repository // DAO구현체에는 무조건 붙어야 하는 어노테이션
public class MemberDAOImpl implements IMemberDAO {

	@Autowired
	private SqlSession sqlSession;
	
	// 네임스페이스
	private static final String namespace = "com.smart.hrd.memberMapper";
	
	@Override
	public String getTime() {
		return sqlSession.selectOne(namespace + ".getTime");
	}

	@Override
	public void insertMember(MemberDTO mDTO) {
		sqlSession.insert(namespace + ".insertMember",mDTO);
		
	}
	
	

}

 

 

에러가 안난다. 입력이 되었는지 알 길이 없다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

수업정리

 

분류 (Classification) - 미리 정의된 여러 클래스 레이블 중 하나를 예측하는 것

 

머신러닝 진행과정

 

1. 주제정하기, 목적선정

2. 데이터 수집

3. 데이터 전처리

4. 기술통계, 데이터간 상관 관계 파악

5. 모델 선택과 하이퍼 파라미터 조정

6. 모델 훈련

7. 성능 확인, 시험, 평가

 

 

 


 

수업시작

학습목표

  •  

 

 

학습된 모델의 상태를 표현하는 단어 3가지

  • 일반화
    • 모델을 훈련시키는 목적, 정확히 예측시키도록 잘 만들어진 모델상태
    • 성능이 훈련, 시험 모두 잘 나오는 것
    • train 성능 95%, test 93%
  • 과대적합
    • 훈련 세트에 너무 맞추어져 있어 테스트 세트의 성능 저하 
    • 조금이라도 달라지는 문제에 대해 정답을 내지 못함
    • 공부는 100점 시험은 0점
    • 훈련 데이터에만 과도하게 정확히 동작
    • ex) 둥글고, 5각형의 무늬가 있고, 반짝반짝 광이나면 공이다.
    • 성능이 훈련만 잘나오고, 시험은 잘 안나오는 것
    • train 성능 90%, test 90%

  • 과소적합
    • 훈련 세트를 충분히  반영하지 못한 훈련 세트, 테스트 세트에서 모두 성능이 저하
    • 너무나도 단순
    • 둥글면 다 공이다
    • 성능이 모두 훈련, 시험 모두 잘 안나오는 것
    • train 성능 60%, test 55% 

 

 

 

모델 복잡도 곡선

파란 점선은 훈련 데이터,   초록 점선은 테스트 데이터

왼쪽에서 오른쪽으로 갈 수록 복잡하다 -> 앞부분은 단순하다. / 뒷부분은 복잡하다. (규칙을 너무 많이 쌓였다)

과대적합

  • 규칙을 찾는게 아닌 문제를 외워버리는 상태

 

훈련 세트는 훈련 할 수록 성능이 올라가나,

테스트 세트는 미래에 예측할 데이터로 생각하면됨. 

테스트데이터의 성능이 가장 높은 지점인 것이 일반화된 모델이라고 볼수있다.

 

세트 = 데이터

 

해결 방법

  • 질 좋은 데이터로 학습, 많은 양의 데이터로 학습
  • 훈련 데이터다양성 보장
    • 암인 사람 50. 암아닌 사람 50 이렇게 골고루 데이터를 가져와야 한다
  • 다양한 데이터의 포인트를 골고루 나타내야함
  • 편중된 데이터는 버리기
  • 규제 (Regularization) 를 통해 모델의 복잡도적정선으로 설정

 

 

암인지 아닌지, 판단하는 모델을 만들 때

암인 사람 50. 암아닌 사람 50 이렇게 골고루 데이터를 가져와야 한다



딥러닝은 학습하는 횟수를 정한다.
문제는 과대적합이다.

특히 딥러닝 가면 데이터가 복잡
딥러닝은 영상이나 이미지

모델의 구조도 사람이 직접 설계

사이킷런을 사용하여 몇줄안되는 코드로 쉽게 훈련 시킬수가 있음

딥러닝은 밀키트 같은거다.
라이브러리를 제공
쉽게할 수있도록 재료를 주면 내가 조립을 해야한다.

모델 학습의 상태 - 일반화, 과대적합, 과소적합

 

KNN (K - Nearest Neighbors)

k-최근접 이웃 알고리즘

  • 가장 가까운 데이터를 찾는다. 
  • k는 갯수
  • k값에 따라 가까운 이웃의 수가 결정됨
  • 분류와 회귀에 모두 사용가능하다
  • 새로운 데이터 포인트와 가장 가까운 훈련  데이터 셋의 데이터 포인트를 찾아 예측
  • k 는 하이퍼 파라미터
  • k 값이 작을 수록 모델의 복잡도가 상태적으로 증가
  • 반대로 k값이 커질수록 모델의 복잡도가 낮아짐
  • 100개의 데이터를 학습하고 k를 100개로 설정하여 예측하면 빈도가 가장 많은 클래스 레이블로 분류
  • 데이터에 민감하게 반응한다.

 

 

장단점 및 주요 매개변수 (하이퍼파라미터)

사이킷런에서 하이퍼파라미터 사용방법

 

  • 이해하기 매우 쉬운 모델
  • 훈련 데이터 세트가 크면 (특성, 샘플의 수) 예측이 느려진다
    • 데이터가 클수록 예측이 느려진다.
  • 수백 개 이상의 많은 특성을 가진 데이터 세트와 특성 값 대부분이 0인 희소(sparse)한 데이터 세트에는  잘 동작하지 않는다.
    • 성능이 좋지않다.
    • 거리계산을 할 때 잘 동작 안함 000000000050000000005000
  • 예측할 때 작동한다.
  • 데이터가 클수록 예측이 느려진다.
  • 거리를 측정하기 때문에 같은 스케일(scale)을 같도록 정규화 필요 
  • 사람은 범위만 봐도 키를 뜻하는지 시력을 뜻하는지 몸무게를 뜻하는지 알지만 컴퓨터는 아니다.

 

 

붓꽃(iris) 데이터셋

  • 클래스 3가지로 이루어져있다.
  • 클래스가 0은 setosa, 1은 virginica, 2는 versicolor 이다. 그러므로 이 클래스 데이터의 종류는 분류데이터이다

 

 

 

 


 

실습해보기

 

 

기본적으로 사용할 라이브러리 import하기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

 

iris_data = load_iris() # 사이킷런 데이터셋 중 붓꽃 데이터셋 가져와서 변수에 담기

 

# 데이터 확인
iris_data

# 데이터셋의 키값 
iris_data.keys()

# 데이터셋의 데이터
iris_data.data

# 데이터 셋의 속성 명
iris_data.feature_names

# 데이터 셋의 레이블 값(정답), (꽃의 품종 정보)
iris_data.target

# 레이블 이름
iris_data.target_names

# 데이터 설명
print(iris_data.DESCR)
 { , , , } : 집합 자료형
 { key : value } : 딕셔너리 = 번치
  • 150개의 데이터가 있다. ( 3개 클래스이며 각 클래스마다 50개의 데이터 존재)
  • 4개의 속성이 존재
    • sepal length - 꽃받침 길이
    • sepal width - 꽃받침 너비
    • petal length - 꽃잎 길이
    • petal width - 꽃잎 너비
  • 3개의 클래스 (라벨) 이 존재
    • Setosa
    • Versicolour
    • Virginica
  • Null값은 없다 (=결측치가 없다)
  • 실습용, 공부용이기 때문에 잘 만들어진 데이터셋이다.
  • 영국 통계학자 로널드 피셔 (Ronald Fisher)가 1936년에 발표한 논문 에서 사용된 데이터 셋이다.
  • 기부자는 Michael Marshall 이다 (1988 년도에 데이터셋 기부) 

 

 

데이터셋 pandas의 데이터프레임으로 만들기

# 데이터는 아이리스 데이터셋의 data, 컬럼은 아이리스 데이터셋의 feature_names
iris_df = pd.DataFrame(data = iris_data.data, columns=iris_data.feature_names)

 

탐색적 분석 (EDA)

pd.plotting.scatter_matrix(iris_df,figsize=(15,15),marker='o', c= iris_data.target,alpha=0.7)
plt.show()
  • 꽃 종류 별로 특징들이 세분화 되어있어서 학습이 잘 될 듯하다.
  • 3개의 클래스가 꽃잎과 꽃받침의 측정값에 따라 비교적 잘 구분되는 것을 알 수 있다.

 

위 사진 같은 부분이 적절히 찾는게 모델의 성능을 좌우한다.

 

 

from sklearn.neighbors import KNeighborsClassifier

# 모델 생성
model = KNeighborsClassifier()

 

사이킷 런 라이브러리 안에 모델을 편리하게 나눠줄 수 있는 기능이 존재한다

 

from sklearn.model_selection import train_test_split
# train_test_split (문제, 정답)
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target)

순서 중요 ,xxyy 순서

random_state : 랜덤을 고정시킨다

랜덤이 정말 랜덤일까

 

 

 

classification_report 라이브러리는 분류 결과 보고서이다

 

모델이 복잡해질 수록 학습데이터는 정확도가 높아지지만
테스트 데이터는 너무 복잡해지면 성능이 좋아지지 않는다.
예측 데이터를 잘 맞출 수 있는 일반화 지점을 잘 찾아야 한다

분류는 다수결 (적절한 이웃의 수를 찾아야 한다  = KNN )

회귀는 평균값 

 

KNN 은 예측할 때 실제 작용한다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. Jackson Databind » 2.9.8 디펜던시 추가

https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.9.8

 

2. SampleController 에 함수 추가

@ResponseBody 어노테이션을 사용하여 JSON 데이터 형식으로 넘겨주기

@RequestMapping("/ex06")
	public @ResponseBody SampleDTO ex06() { // @ResponseBody : 응답할 때 JSON 데이터로 반환
		log.info("/ex06.................");
		
		SampleDTO dto = new SampleDTO();
		dto.setAge(10);
		dto.setName("홍수영");
		
		return dto;
		
	}

실행결과

객체 자체를 @ResponseBody 어노테이션을 통해 알아서 JSON 화 시켜서 넘겨준다

 

 

 

Network 쪽에서 확인하기

Network > Preview 에서 json 데이터 확인 가능하다.

 

 

 

 

3. map 사용하기

@RequestMapping("/ex06_1")
	public @ResponseBody Map<String, SampleDTO> ex06_1(){
		log.info("/ex06_1.................");
		
		SampleDTO dto = new SampleDTO();
		dto.setAge(12);
		dto.setName("홍길자");
		
		Map<String, SampleDTO> map = new HashMap<String, SampleDTO>();
		map.put("info", dto);
		
		return map;
	}

실행결과

 

 

4. 옛날에 json 썼던 방식

// 옛날에 만들던 json 방식
	@RequestMapping("/ex07")
	public ResponseEntity<String> ex07(){
		log.info("/ex07............");
		
		// 2010 년도에까지도...
		
		// jQuery 가 활성화 되면서 json 데이터를 보내기 시작
		// 스크립트는 규약에 따라서 데이터가 전송이 안되고 전송 받지도 못함.
		// 크로스 도메인을 우회할 수 있다.
		String msg = "{\"name\":\"홍길자\",\"age\":12}";
		
		HttpHeaders header = new HttpHeaders();
		header.add("Content-type", "application/json;charset=UTF-8");
		// header와 똑같이 만들어줘야함
		
		
		return new ResponseEntity<String>(msg, header, HttpStatus.OK);
	}

json 방식을 직접 문자열로 써줘야 했고

header 객체를 사용하여 "Content-type" , "application/json;charset=UTF-8" 추가 

 

 

파일첨부 방식

5. Apache Commons FileUpload » 1.3.3 디펜던시 추가

was 방식과 filesystem 이 있다.

https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload

 

6. 폴더 추가 resources > upload > tmp , upload폴더 추가 후에 tmp폴더 추가

여기가 사진 파일들 넣어질 경로

 

7. 첨부파일 페이지 생성하고 전송해보기

 

sample 폴더에 exFileUpload.jsp 추가

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="ctx" value="${pageContext.request.contextPath  == '/' ? '' : pageContext.request.contextPath }" />
<!-- 현재 페이지가 컨텍스트루트를 읽어왔을 때 슬러시 (/)면 '' 아니면 컨텍스트루트로 --> 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>exFileUpload.jsp</title>
</head>
<body> <!-- file 첨부는 get 방식은이 안된다. 용량이 제한적이기 때문에  -->
	<!-- 파일 첨부시  enctype="multipart/form-data" 속성을 넣어줘야한다 -->
	<form action="${ctx}/sample/exUploadPost" method="post" enctype="multipart/form-data">
		<div>
			<input type="file" name="files">
		</div>
		<div>
			<input type="file" name="files">
		</div>
		<div>
			<input type="file" name="files">
		</div>
		<div>
			<input type="file" name="files">
		</div>
		<div>
			<input type="submit" value="파일등록">
		</div>

	</form>
</body>
</html>

 

SampleController 에 함수 추가

// 파일 등록 화면 호출
	@RequestMapping(value="/exFileUpload", method = RequestMethod.GET)
	public void exUpload() {
		log.info("/exUpload..");
	}
	
	
	// 자동 수집이 가능
	@RequestMapping(value = "/exUploadPost", method = RequestMethod.POST)
	public void exUploadPost(ArrayList<MultipartFile> files) throws Exception{
		log.info("/exUploadPost...............");
		
		for (int i = 0; i < files.size(); i++) {
			log.info("--------------------------------");
			log.info(files.get(i).getOriginalFilename());
			log.info(files.get(i).getSize());
		}
		
		for (MultipartFile multipartFile : files) {
			log.info("*********************************");
			log.info(multipartFile.getOriginalFilename());
			log.info(multipartFile.getSize());
		}
		
		// 람다 표기법
		// 
		files.forEach(file -> {
			log.info("+++++++++++++++++++++++++++++++++");
			log.info(file.getOriginalFilename());
			log.info(file.getSize());
		});
		
	}

servlet-context.xml 에 추가

<!-- 등록 파일 용량 제한 -->
	<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="maxUploadSize" value="10485760"/>
	</beans:bean>

 

http://localhost:9000/sample/exFileUpload

접속 후 첨부파일 전체 등록하고 파일등록해서 전송하기

 

 

 

9. 에러발생시키기

pakage 추가 > CommonExceptionActive 클래스 파일 추가

 

package com.smart.hrd.exception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class CommonExceptionActive {
	private static final Logger log = LoggerFactory.getLogger(CommonExceptionActive.class);

	@ExceptionHandler(Exception.class)
	public String except(Exception ex, Model model) {
		log.error("Exceiption...........{}", ex);

		model.addAttribute("exception", ex);

		log.info("model................{}", model);

		return "error_page";
	}
}

 

 

views 폴더 경로에 error_page.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error_exception.jsp</title>
</head>
<body>
	<h4><c:out value="${exception.getMessage() }"></c:out></h4>
	<ul>
		<!-- exception.getStackTrace() 는 자바에서 예외를 처리할 때 사용하는 메서드 중 하나 -->
		<c:forEach items="${exception.getStackTrace() }" var="stack">
			<li><c:out value="${stack }"></c:out></li>
		</c:forEach>
	</ul>
</body>
</html>

 

에러실행

http://localhost:9000/sample/ex04?name=aaa&age=aad&page=2

 

age=aad : age에 숫자가 아닌 문자를 입력함으로써 에러를 발생시키는 주소로 접속

결과 화면

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

수업 정리

 

모든 예외 상황에 대해 규칙을 정할 수 없다! 

 

즉, 직접 판단할 수 있게 컴퓨터를 학습 시켜 처리하도록 한다.

 

머신러닝의 학습 종류 3가지

  • 지도학습 - 문제가 있고 정답이 있다
  • 비지도 학습 - 문제는 있지만 정확한 답이 없다 = 데이터를 좀 더 이해시킨다.
    • 숨어있는 특징, 패턴을 파악
    • 클러스터링, 차원축소
  • 강화 학습 - 지도학습과 비슷하며, 문제도 있고, 정확한 답은 없다.
    • 보상에 따른 학습

머신러닝 종류

  •  

 

머신러닝 과정

  • 문제정의
    • 답이 분류 일까 회귀일까
  • 데이터 수집
    • 관련된 데이터를 수집한다.
  • 데이터 전처리
    • 학습 시 결측치가 있으면 에러가 나기 때문에 결측치는 채워줘야 한다.
    • 이상치도 처리해준다.
  • 탐색적 데이터 분석
    • 데이터 시각화, 데이터의 특징을 알아낼 수 있다
    • 필요없는 특성 버리기
  • Model 선택
    • 적절한 모델 선택
    • 적절한 특성
    • 하이퍼 파라미터를 추가 한다 데이터 성능을 위해
  • Model Training 학습
    • model.fit 을 통해 학습시키고, model.predict 를 통해 테스트한다.
    • 데이터를 7:3으로 나누어 학습과 테스트에 사용한다.
    • 학습은 X_train, y_train, 테스트는 X_test 로 사용한다.
  • 평가
    • 정확도, 재현율, 정밀도, f1_score

 

 

 


 

 

 

수업시작

 

우리가 앞으로 사용하게될 라이브러리 - scikit-learn (사이킷-런)

  • 사용하기 쉽다
  • 학습을 위해 샘플 데이터도 제공한다.

 

 

비만도 데이터를 이용해 학습해보기 - 실습


1. 학습시 무조건 기본적으로 import 하기

 

import pandas as pd
import matplotlib.pyplot as plt

 

2. 파일 불러오기

# 파일 불러오기 - bmi_500.csv
bmi = pd.read_csv('bmi_500.csv', index_col = 'Label') # Label 컬럼을 인덱스로 사용하기
bmi

 

판다스는 넘파이를 기반으로 한다.
시리즈는 ndarray

3. 파일 최상위 5개 확인

bmi.head() # 최상위 데이터 5개만 확인하기

 

4. 파일 정보 보기

# 대략적인 정보확인 가능
# 전체 row수, 컬럼별 정보 확인, 결측치 여부
bmi.info()
# 결측치가 없다!

Index : 데이터 총 개수, 행의 총 개수

Data columns : 컬럼 총 개수

Non-Null : 결측치가 없다

 

5. 기술통계 보기

# 기술통계 확인 : 의미가 있는 통계
bmi.describe()

count : 데이터 개수

min : 최소 값

max : 최대 값

25%~75% : 사분위수 뜻함

std: 표준편차

mean : 평균 값

대부분의 데이터가 아래쪽에 몰려있다.

 

6. 중복없이 인덱스 이름 보기

bmi.index.unique() # 중복없이 본다
# 총 6개가확인됨

 

7. Label 이 Normal 인 사람의 데이터만 가져오기

bmi.loc['Normal'] #loc 원하는 컬럼만 가져오기/ loc = 문자 인덱스 선택, iloc = 숫자 index 선택

 

8. 라벨이 Normal 인 사람들의 키 (Height) 컬럼 가져오기

# 인덱스가 Normal 인사람의 키만 가져오기
bmi.loc['Normal','Height']
# 두번째 방법 bmi.loc['Normal']['Height']

 

9. 산점도 그려보기

함수 호출생성

# 산점도
# 함수 생성
def myScatter (label, color) : # 점을 흩뿌리다
    tmp = bmi.loc[label] # 라벨에 매개변수의 라벨인 데이터만 담기
    plt.scatter(tmp['Weight'], # x 값
                tmp['Height'], # y 값
                c = color, # 컬러는 매개변수의 컬럼
                label = label)

함수 호출

# 산점도 그리는 함수 호출
plt.figure(figsize=(5,5))
myScatter('Extreme Obesity', 'red')
myScatter('Weak', 'black')
myScatter('Obesity', 'purple')
myScatter('Normal', 'blue')
myScatter('Overweight', 'green')
myScatter('Extremely Weak', 'pink')
plt.xlabel('Weight')
plt.ylabel('Height')
plt.legend()  # legend() =범례 : 기호, 색상, 라인 등이 어떤 데이터를 나타내는지 설명하는 정보
plt.show()
  • 클래스 별로 분류가 잘되어 보여서 이상태로 모델링 해도 될 듯싶다는걸 알수있다

 

10. 모델링 시작

head로 맨위 데이터 한개 가져오기

bmi.head(1)
# 인덱스를 리셋(컬럼으로)
bmi.reset_index(inplace=True) # inplace 시킨 걸 bmi에 바로 적용시키겠다
# 안그러면 재할당 해줘야 한다 bmi = bmi.reset_index(inplace=True) 이렇게
bmi.head(2)

 

 

데이터 나누기

# 1. 문제와 답으로 분리
X = bmi[['Height','Weight']]     # 문제
y = bmi['Label']                 # 답

 

11. 학습 데이터와 테스트 데이터로 나누기

# 2. train(훈련셋)과 test(평가셋)분리
# 훈련, 평가는 7:3으로 나누어준다
# iloc 는 인덱싱을 도와주는 함수 (행과열을 할 때 도와줌)
X_train = X.iloc[:350]
y_train = y.iloc[:350]
X_test = X.iloc[350:]
y_test = y.iloc[350:]

 

 

12. 잘 나누어졌는지 확인하기

X_train.shape, y_train.shape, X_test.shape, y_test.shape

 

13. 모델 생성

from sklearn.neighbors import KNeighborsClassifier
# knn 모델 생성
knn_model = KNeighborsClassifier() # knn_model 변수에 담아주기

 

14. 학습

# 4-1. 학습
knn_model.fit(X_train, y_train)
# 4-2. 예측
pre = knn_model.predict(X_test) 
# 학습된 모델이 예측한 값

 

15. 정확도 알아보기

평가를 위한 모듈 불러오기

from sklearn import metrics # 평가를 위한 모듈
metrics.accuracy_score(pre, y_test) # 정확도 - metrics.accuracy_score(예측값, 정답)

 

16. 만든 모델 사용해보기

knn_model.predict( [[190,50], [160,80],[170,50],[110,50]] ) #학습 모델이 컬럼이 2개이기 때문에 안에도

 

# 5 = n_neighbors가 적을 수록 판단이 느슨해짐 = 과적합 = 정답이 아닌데도 정답이라고 함
#10 = n_neighbors가 많을 수록 판단이 깐깐해짐 = 과소적합 = 정답이 맞는데도 정답이 아니라고 함
# 그 중간을 잘 찾아내야함

# 데이터 셋 개수가 많으면 6:4로 해도된다.

 

17. 모델 최적화

knn_model = KNeighborsClassifier(n_neighbors=10)

n_neighbors 속성에 값 변경

기본 값은 5로 되어있음

 


 

 

 

학습의 목표는 일반화된 모델을 찾는 것!!

 

 

모델종류

  • 일반화 (Generalization)
    • 정확히 예측하도록 하는 것
    • 이상적임 (훈련잘된 케이스)
    • 일반화 성능이 최대화 되는 모델을 찾는것이 목표
  • 과대적합 (Overfitting)
    • 훈련 세트에 너무 맞추어져 있어 테스트 세트의 성능 저하
    • 너무 상세하고 복잡한 모델링을 하여 훈련데이터에만 과도하게 정확히 동작하는 모델
  • 과소적합 (Underfitting)
    • 훈련 세트를 충분히 반영하지 못해 훈련 세트, 테스트 세트에서 모두 성능이 저하
    • 모델링을 너무 간단하게 하여 성능이 제대로 나오지 않는 모델

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

VO 와 DTO

VO와 DTO는 둘 다 객체지향 프로그래밍에서 사용되는 용어로, 데이터 전달 및 관리를 위한 클래스를 구현할 때 사용

 

VO는 값을 읽고 반환하는 데 사용되는 단순한 객체이며, DTO는 서로 다른 계층 간에 데이터를 전달하기 위한 객체입니다. VO는 불변성을 가지고 있고, DTO는 가변성을 가질 수 있습니다

 

화면쪽과 가까우면 dto, 모델과 가까우면 vo

 

1. 패키지 생성

 

 

 

컬럼에 스네이크 표기법을 쓴다.

우리는 카멜표기법을 쓴다. 

 

JPA(Java Persistence API)는 자바 진영에서 ORM(Object-Relational Mapping) 기술을 표준화한 API입니다. JPA는 데이터베이스와 객체 간의 매핑 작업을 편리하게 처리할 수 있도록 해주며, 개발자는 SQL 쿼리를 직접 작성하지 않아도 객체를 통해 데이터를 조작할 수 있습니다.

2. 클래스 생성 SampleDTO

@Data 어노테이션은 
Getter
Setter
RequiredArgsConstructor
ToString
EqualsAndHashCode
lombok.Value
을 만들어준다

도메인 패키지는 객체를 모아두는 곳

쿼리는 질의어 스트링은 문자열  쿼리스트링 = 질의어 문자열

 

 

3. SampleController > 함수 추가

함수추가1

@GetMapping("/ex01") // url 주소로 메소드 명을 만들면 편하다
	public String ex01(SampleDTO sDto) { // 메소드의 구성요소 / 접근제한자, 반환자료형, 메소드명, 매개변수()
		log.info(sDto); // 타입도 자동 변환해준다. (쿼리스트링은 문자열로 내려오는데..)
		
		return "ex01"; // return 값으로 jsp 파일명을 넣어준다
		
	}
브레이크 포인트

1. 멈출부분에 커서 클릭 한번 해주고, 왼쪽 파란부분에서 더블클릭 해준다.

 

2. 벌레클릭

3. 서버접속

4. 화면에 ok 할거 있으면 클릭해주고 연두색 부분에 마우스 올려보면 노란색 설명 창 나온다.

 

F6 키 한번씩 눌러서 디버깅 해보기

 

실행 코드 나오면 디버깅 끝남

 

함수추가2

@GetMapping("/ex02List")
	public String ex02List(@RequestParam("ids") ArrayList<String> ids) { // @RequestParam() 배열 형식의 데이터 넘길때
		log.info("ids ==> "+ids);
		
		
		return "ex02List";
	}

 

 

함수추가3

 

@GetMapping("/ex02Array")
	public String ex02Array(@RequestParam("ids") String[] ids) {
		log.info("ids ==> "+Arrays.toString(ids));
		
		
		return "ex02Array";
	}

 

결과로그

 

 

 

전체코드

package com.smart.hrd;

import java.util.ArrayList;
import java.util.Arrays;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.smart.hrd.domain.SampleDTO;

import lombok.extern.log4j.Log4j;

@Controller // 컨트롤러가 찾아올 수 있게
@RequestMapping("/sample") //
// @RequestMapping("/sample/*") // 또다른 방법 
@Log4j 
public class SampleController {
	
	// 뒤에 경로를 안써주면 /sample 만 적어주면 실행됨
	//@RequestMapping("") 
	@GetMapping("/basic")
	public void basic() {
		log.info("basic1................................");
	}
	
	// @RequestMapping(value="/basic", method = {RequestMethod.GET,RequestMethod.POST}) // 잘 안씀
	@RequestMapping(value="/basic1", method = {RequestMethod.GET,RequestMethod.POST})
	public void basicGet() {
		log.info("basic1...........");
	}
	
	@RequestMapping(value="/basic1", method = RequestMethod.POST)
	public void basicPost() {
		log.info("basic3...........");
 	}
	
	@GetMapping("/ex01") // url 주소로 메소드 명을 만들면 편하다
	public String ex01(SampleDTO sDto) { // 메소드의 구성요소 / 접근제한자, 반환자료형, 메소드명, 매개변수()
		log.info(sDto); // 타입도 자동 변환해준다. (쿼리스트링은 문자열로 내려오는데..)
		
		return "ex01"; // return 값으로 jsp 파일명을 넣어준다
		
	}
	
	@GetMapping("/ex02List")
	public String ex02List(@RequestParam("ids") ArrayList<String> ids) { // @RequestParam() 배열 형식의 데이터 넘길때
		log.info("ids ==> "+ids);
		
		
		return "ex02List";
	}
	
	@GetMapping("/ex02Array")
	public String ex02Array(@RequestParam("ids") String[] ids) {
		log.info("ids ==> "+Arrays.toString(ids));
		
		
		return "ex02Array";
	}
	
}

 

ArrayList와 HashMap

ArrayList와 HashMap은 모두 자바에서 제공하는 컬렉션 프레임워크의 일부분입니다.
ArrayList는 크기를 조정할 수 있는 배열이며, 원소들은 인덱스를 이용하여 접근할 수 있습니다. 즉, 순서가 있고 중복된 값이 허용됩니다.
HashMap은 key-value 쌍으로 이루어진 데이터를 저장하는 자료구조로, 원소들은 key를 이용하여 접근합니다. 즉, 순서가 없고 key는 중복될 수 없지만, value는 중복될 수 있습니다.
따라서 ArrayList는 원소들을 인덱스로 접근하고, HashMap은 key를 이용하여 값을 찾습니다.
ArrayList의 장점은 인덱스를 이용하여 빠르게 원소에 접근할 수 있으며, 순서가 있어서 정렬이 용이합니다.
HashMap의 장점은 key를 이용하여 빠르게 값을 찾을 수 있으며, 검색과 삭제의 성능이 좋습니다.
ArrayList는 순서가 있기 때문에, 데이터의 삽입과 삭제가 중간에 일어날 경우 성능이 떨어질 수 있습니다. 그러나 HashMap은 순서가 없기 때문에, 데이터의 순서를 유지해야 할 때는 사용하기 어렵습니다.
따라서 ArrayList와 HashMap은 서로 다른 용도로 사용되며, 어떤 상황에서 사용할지는 데이터의 특성과 사용할 목적에 따라 결정해야 합니다.

 

 

4. domain 패키지에 SampleDTOList  클래스 추가

 

 

5. SampleContoller 에 함수 추가

 

@GetMapping("/ex02Bean")
	public String ex02Bean(SampleDTOList list) {
		
		log.info("list dtos ===> " + list);
		return "ex02Bean";
	}

 

 

6. domain 에 TodoDTO 생성

 

 

아무리 스프링이라도 date 타입은 자동 변환 되지 않는다.!

그래서 @InitBinder  처리를 해준다  다른 방법으로는    dto 에서 @DateTimeFormat 어노테이션 추가해주기

 

@InitBinder

 

@DateTimeFormat

 

TodoDTO

package com.smart.hrd.domain;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;

import lombok.Data;

@Data
public class TodoDTO {

	private String title;
	@DateTimeFormat(pattern="yyyy/MM/dd")
	private Date dueDate;
}

 

SampleController

    // dto에서 @DateTimeFormat 방식으로 사용해서 주석처리해놓음
//	@InitBinder 
//	public void initBinder(WebDataBinder binder) { 
//		// data 포맷 방식 - simple 포맷방식,
//		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
//		
//		binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(dateFormat, false));
//	}
	
	// 날짜 데이터 타입
	@GetMapping("/ex03")
	public String ex03(TodoDTO todo) {
		// 에러가 나는게 맞다. 날짜 타입은 자동 변환 안됨
		// 그래서 initBinder를 추가해줌 혹은 dto 에 @DateTimeFormat 추가
		log.info("todo ==========>" + todo);
		return "ex03";
	}

 

7. SampleController 에 함수 추가 , views 폴더에 sample 폴더 생성 후 sample.jsp 생성

// Model 은 ui와 관련이 있다.
	@GetMapping("/sampleModel")
	public String sampleModel(Model model) {
		// 생성과 동시에 초기화
		SampleDTO sampleDTO = new SampleDTO("홍길동",18); 
		// sampleDTO.setAge(0); : 직접 초기화방식

		log.info("sampleModel ======>" + sampleDTO );
		
		
		// addAttribute() 사용 형태
		// 1. addAttribute("이름", 객체) : 객체에 특별한 이름을 부여해 뷰에서 이름값을 이용하여 객체처리
		// 2. addAttribute(객체) : 이름을 지정하지 않는 경우에는 자동으로 저장되는 객체의 클래스명 앞 글자를 소문자로 처리한 클래스 명을 이름으로 간주함.
		// 이름 변경해서 쓰는 방법
		//model.addAttribute("aaaa",sampleDTO);

		// 변수명 그대로 이름쓰는방법 
		model.addAttribute(sampleDTO);
		
		return "/sample/sample";
		
	}

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>이름 : ${sampleDTO.name }</h1>
	<h1>나이 : ${sampleDTO.age }</h1>
</body>
</html>

 

접속 주소 : http://localhost:9000/sample/sampleModel

자동으로 jsp 파일 있는 주소로 찾아가준다

 

8. SampleController 에 함수 추가 ex04, views > sample > ex04.jsp 생성

@GetMapping("/ex04")
	public String ex04(SampleDTO dto, @ModelAttribute("page") int page) {
		log.info("dto =====>" + dto);
		log.info("page ====>" + page); // 기초자료형은 바로 반환이 안된다
		// 그래서 @ModelAttribute 를 추가해준다
		return "/sample/ex04";
	}

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>SAMPLE DTO : ${sampleDTO }</h2>
	<h2>page : ${page }</h2>
</body>
</html>

접속 주소 : http://localhost:9000/sample/ex04?name=홍길동&age=19&page=3

자동으로 jsp 파일 있는 주소로 찾아가준다

 

 

9. SampleController 에 함수 추가 doE / doF , views > sample > redirectAttributeResult.jsp 생성

 

@RequestMapping(value="/doE") // 1. 브라우저에서 호출
	public String doE(RedirectAttributes rttr) {// RedirectAttributes : 팝업을 쉽게 구현, 단발성 (딱 한번만 나옴)
		log.info("doE 호출되지만 /doF로 리다이렉트 .......");
		rttr.addFlashAttribute("msg", "리다이렉트된 메세지 입니다."); // 2. 객체 담고
		
		return "redirect:/sample/doF";
	}
	
	@RequestMapping("/doF")
	public String doF(String msg) { // 3. 메시지 객체 받고
		log.info("doF 호출됨 ............");
		
		return "/sample/redirectAttributeResult"; // 4. redirectAttributeResult 페이지로 찾아감
		
	}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function result(){
		var msg = "${msg}";
		alert(msg);
	}
</script>
</head>
<body onload="result();">

redirectAttributeResult : ${msg}

	
</body>
</html>

 

접속주소 http://localhost:9000/sample/doE  로 접속하면

자동으로 http://localhost:9000/sample/doF 로 바뀌며

경고창이 뜬다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

학습목표

  • 머신러닝의 개념 이해
  • 머신러닝의 종류 및 과정
  • 기계학습과 관련된 기본 용어

 

머신러닝 (Machine Learning)이란?
.
기계학습 - 컴퓨터를 학습시키는 것
인공지능(Artificial Intelligence)의 한 분야
프로그래밍 된 컴퓨터
컴퓨터가 데이터를 분석하고 학습하여
스스로 패턴을 찾고 예측하는 능력을
갖추도록 하는 기술
.
크게 3가지로 분류 됨
지도학습(Supervised Learning)
비지도학습(Unsupervised Learning)
강화학습(Reinforcement Learning)
.
바둑의 경우의 수
첫 수부터 모든 수까지 약 2 x 10^170

 

 

머신러닝의 출현

머신러닝의 아버지 엘런 튜링

엘런 튜링의

" 1950년도에 기계인간과 같은 사고를 할 수 있는가? "

가 화두가 되었다.

 

 

머신러닝의 발전

컴퓨터가 공부할 자료는 데이터이다.

 

 

 

 

 

산업혁명

  • 18세기 영국에서부터 시작되었음
  • 획기적으로 바뀌게 되는 계기

 

산업혁명의 흐름

  • 1차 기계
  • 2차 전기
  • 3차 컴퓨터
  • 4차 AI, IoT, BigData

 

인공지능 (Artificial Intelligence)

머신러닝

  • 사람을 흉내내는 모든 분야
  • 정확한 규칙을 세워서 처리하는 일
  • 세상에는 모든 일에 규칙을 세울 수가 없다. -> 머신러닝 탄생
  • 사람을 흉내내는 걸 학습시킨다.
  • 데이터를 기반으로 학습을 시켜서 예측하게 만드는 기법
  • 인공지능의 한 분야로 컴퓨터가 학습 할 수 있도록 하는 알고리즘과 기술을 개발하는 분야
  • 학습을 통해 
  • 데이터를 이용하여 특성과 패턴을 학습하고 그 결과를 바탕으로 미지의 데이터에 
  • 통계학, 데이터마이닝, 컴퓨터 과학이 어우러진 분야
    • 데이터 마이닝 : 대규모 데이터에서 유용한 정보를 추출하는 프로세스
  • 자연어 처리

 

딥러닝

  • 매번 똑같지 않게 생겼지만 같은 사람을 구분하고 분류하는것
  • 고양이인지 개인지 구분하는 것
  • 추상적인 걸 학습시켜 사람처럼 판별이 가능하게 하는 것

 

 

Rule-based expert system

  • 단점
    • 스팸 메일 필터가 안된다..
    • 매번 같은 표정, 옷 일 수가 없기에 얼굴 인식 시스템 개발 불가
    • 많은 상황에 대한 규칙들을 모두 만들어 낼 수 없다.

 

 

머신러닝

-  머신러닝이란 학습을 통해 새로운 데이터를 예측하거나 분류하는 것

데이터를 이용하여 특성과 패턴학습 -> 미래 결과예측 (판단, 추론)

 

 

 

의료 인공지능 분야 사례

  • 영상 의료/병리 데이터의 분석 및 판독 (Deep Learning) - 영상의학과 전문의

 

 

산업 인공지능 분야 사례

  • 신제품 마케팅 - 인공지능 트렌드 분석 시스템 '엘시아(LCIA)'

 

 

 

 

예술 인공지능 분야 사례

 

 

머신러닝 종류

 

지도학습 (Supervised Learning)
  • 이게 문제이고, 이게 답이야 라고 알려줌
  • 데이터에 대한 라벨 (명시적인 답) 이 주어진 상태에서 컴퓨터를 학습시키는 방법
  •  규칙을 찾아감
  • 분류회귀로 나뉘어진다. - 분류와 회귀로 나눠지는 것에 문제는 중요하지 않다. 이 중요하다.
    • 분류 (Classification)
      • 미리 정의된 여러 클래스 레이블 중 하나를 예측
      • 속성(Attribute)값을 입력, 클래스 값을 출력하는 모델 -> 모델에 문제를 입력하고 답을 출력 시키는 모델
      • 붓꽃(iris)의 세 품종 중 하나로 분류, 암 분류 등.
      • 예측값이 다르면 타격이 크다
      • 이진분류, 다중 분류 등이 있다
        • 이진분류 (Binary Classification) : 둘 중 하나
        • 다중분류 (Multi-class Classification) : 여러 개 중 하나
    • 회귀 (Regression)
      • 연속적인 숫자를 예측
      • 속성 값을 입력, 연속적인 실수 값을 출력하는 모델
      • 어떤 사람의 교육 수준, 나이, 주거지를 바탕으로 연간 소득 예측.
      • 예측 값의 미묘한 차이가 크게 중요하지 않다. -> 조금 달라도 별 차이가 없다.
  • 지도, 비지도, 강화중에서 가장 중점이 된다.
  • 예시
    • 스팸메일 분류 - 분류 
    • 집 가격 예측 - 회귀 (연속적인 수치를 예측)

class = lable = 답

feature = attribute = column = 문제

 

비지도학습 (Unsupervised Learning)
  • 지도학습이 아니다.
  • 데이터에 대한 정답이 없는 상태에서 컴퓨터를 학습
  • 학습시키려는데 문제는 있으나 답이 명시적이지 않다.
  • 데이터의 숨겨진 특징, 구조, 패턴을 파악하는데 사용
  • 데이터를 비슷한 특성끼리 묶는 클러스터링 (Clustering)과 차원 축소 (Dimensionality Reduction)등이 있다.
    • 클러스터링 : 데이터 내에서 유사한 패턴이나 구조를 찾아 그룹화하는 것을 목적
    • 차원 축소 : 고차원의 데이터를 저차원으로 축소시키는 기법

 

 

강화학습(Reinforcement Learning)
  • 지도학습과 비슷하지만 완전한 답(Label)을 제공하지 않는 특징이 있음
  • 특정한 환경(Environment) 내에서 행동(Action)을 하고, 그에 대한 보상(Reward)을 받아 보상을 최대화하는 방향으로 학습을 진행하는 것
  • 기계는 더 많은 보상을 얻을 수 있는 방향으로 행동을 학습
  • 주로 게임이나 로봇을 학습시키는데 많이 사용

 

 

머신러닝이 유용한 분야

  • 기존 솔루션으로는 수동 조정과 규칙이 필요한 문제
  • 전통적인 방식으로는 전혀 해결 방법이 없는 복잡한 문제
  • 새로운 데이터에 적응해야하는 유동적인 환경
  • 대량의 데이터에서 통찰을 얻어야 하는 문제

 

 

머신러닝 과정

  1. 문제 정의 (Problem Identification)
    • 비즈니스 목적 정의
      • 모델을 어떻게 사용해 이익을 얻을까?
    • 현재 솔루션의 구성 파악
    • 지도 vs 비니도 vs 강화
    • 분류 vs 회귀
  2. 데이터 수집 (Data Collect)
    • File (csv, xml, json)
    • Database
    • Web Crawler (뉴스, sns, 블로그)
    • IoT 센서를 통한 수집
    • Survey
  3. 데이터 전처리 (Data Preprocession)
    • 결측치, 이상치 처리
    • 특성공학 (Feature Engineering)
      • 단위변환 (Scaling)
      • 새로운 속성 추출 (Transform)
      • 범주형 -> 수치형 (Encoding)
      • 수치형 -> 범주형 (Binning)
  4. 탐색적 데이터 분석 (EDA, Exploratory Data Analysis) - 시각화 그래프
    • 기술통계 (의미가 있는 값), 변수간 상관 관계
    • 시각화
      • pandas
      • matplotlib
      • seaborn
    • Feature Selection (사용할 특성 선택) - 학습이 잘될 수 있는 특성 선택
  5. 모델 선택, Hyper Parameter 조정 
    • Hyper Parameter : 모델의 성능을 개선하기 위해 사람이 직접 넣는 parameter
    • 목적에 맞는 적절한 모델 선택
    • KNN, SVM, Linear Regression, Ridge, Lasso, Decision Tree, Random forest, CNN, RNN ...
  6. 학습 (Model Training)
    • model.fit(X_train,y_train) - 파라미터 값으로 문제와, 답을 학습시킨다.
      • train 데이터와 test 데이터를 7 : 3 정도로 나눔
    • model.predict(X_test) - 테스트를 하는데 문제만 주고 답을 내게 한다.
    • 데이터의 70% 는 train 데이터, 30% 는 test 데이터로 사용
      • 70% 로 학습시키고 실사용 전에 학습이 잘 되었는지 30%로 테스트 한다.
  7. 평가 (Evaluation)
    • 정확도 (accuracy) 
      • 실제 중 얼마나 맞췄는가
      • 예측 중 얼마나 맞췄는가
      • 정확도의 오류 
    • 재현율 (recall)
    • 정밀도 (precision) 
      • 스팸메일의 경우 내가 원하는 메일이였는데 스팸메일로 구분 되어
    • f1 score

 

학습 (모델 트레이닝)

 

 

 

 

1. mvn > mybatis 3.4.1 버전 디펜던시 추가

https://mvnrepository.com/artifact/org.mybatis/mybatis/3.4.1

 

 

 

2. mvn > mybatis-spring 1.3.0 버전 디펜던시 추가

https://mvnrepository.com/artifact/org.mybatis/mybatis-spring/1.3.0

 

 

 

3. mvn > Spring JDBC 4.3.8 버전 디펜던시 추가

https://mvnrepository.com/artifact/org.springframework/spring-jdbc/4.3.8.RELEASE

버전 부분만 저렇게 변수 사용하는 것처럼 바꿔주기

 

4. mvn > Spring Transaction 4.3.8 버전 디펜던시 추가

https://mvnrepository.com/artifact/org.springframework/spring-tx/4.3.8.RELEASE

버전 변수로 바꿔주기

5. root-context.xml > Namespaces 체크

 

 

 

6. root-context.xml > bean 추가

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   		<property name="dataSource" ref="dataSource"></property> <!-- ref : 참조, 어디를 가리키고 있는 것 -->
   	</bean>

 

설명 

인터페이스는 컴마구분으로 여러개를 받을 수 있다.

 

// 롬복 라이브러리 미사용할 경우
	// @Autowired // 얘를 더 익숙하게 볼것이다
	// private DataSource dataSource;

 

7. DataSourceTest > 코드작성

package com.smart.hrd;

import static org.junit.Assert.*;

import java.sql.Connection;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

// 지정한 클래스를 이용해 테스트 메서드를 수행하도록 지정해주는 어노테이션
@RunWith(SpringJUnit4ClassRunner.class)
// 지정된 클래스나 문자열을 이용해서 필요한 객체들을 스프링 내에 객체로 등록
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
// 롬복을 이용해서 로그를 기록하는 Logger 변수를 생성
@Log4j
public class DataSourceTest {
	// 롬복 라이브러리 미사용할 경우
	// @Autowired // 얘를 더 익숙하게 볼것이다
	// private DataSource dataSource;
	// @Setter : 롬복 라이브러리를 이용해 setter를 자동으로 만들어 주는 어노테이션
	// @Autowired : *인스턴스 변수 에 알맞은 타입의 객체를 자동으로 주입해주는 어노테이션
	// *인스턴스 변수 = dataSource
	@Setter(onMethod_ = { @Autowired })
	private DataSource dataSource;

	@Setter(onMethod_ = { @Autowired })
	private SqlSessionFactory sqlSessionFactory;
	
	@Test
	public void testConnection() {
		try (SqlSession session = sqlSessionFactory.openSession();
				Connection con = dataSource.getConnection()) {
			log.info(sqlSessionFactory);
			log.info(con);
		} catch (Exception e) {
			fail("Not yet implemented");
		}
	}

}

 

 

 

8. resouces > xml 파일 선택 > mybatis-config 파일 생성

mybatis-config 파일 생성

 

https://mybatis.org/mybatis-3/ko/getting-started.html 접속

 

MyBatis – 마이바티스 3 | 시작하기

 

mybatis.org

쭉내려서

복사

 

붙여넣기

 

 

9. root-context.xml > sqlSessionFactory bean 에 property 추가

<property name="configLocation" value="classpath:/mybatis-config.xml"></property> <!-- SqlSessionFactoryBean.class 에 멤버필드에 잡혀있는 이름으로 해준다 -->

 

 

 

10. src.test.java 패키지 > MyBatisTest JUnit 생성

 

 

package com.smart.hrd;

import static org.junit.Assert.*;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class MyBatisTest {

	@Autowired // 스프링 관리하는 빈(bean) 내에서 의존성(dependency)을 자동으로 주입(injection)해주는 기능
	private SqlSessionFactory sqlFactory;
	
	
	@Test
	public void test() {
		log.info(sqlFactory);
	}
	
	@Test // 테스트라는 어노테이션이 붙어있어야 호출된다.
	public void testSession() {
		
		try (SqlSession session = sqlFactory.openSession()) {
			// io , database 객체, 빨간줄이 뜬다. 그러면 컴파일이 안되고 클래스 파일이 생성이 안되고, 실행이 안된다.
			// 예외처리 종류 3가지 try catch, throws, throw
			log.info(session);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

 

Run As 실행시 초록 불 떠야함

 

Mybatis 쓰는 방식이 3가지가 있다.

1. XML 기반 Mapper 사용 방식 

2. 어노테이션 기반 Mapper 사용 방식

3. Mix 방식

3. Mapper interface 방식 - 댓글달기 할 때 수업할 예정

 

 

 

11. path 숨기기 > 서버 더블클릭  >  Modules 클릭 > Edit...클릭

톰캣 서버 더블클릭

 

Moduls 클릭

 

Edit... 클릭

hrd 지우고 OK 클릭

 

Path 지워진 것 확인

 

 

톰캣 서버 실행버튼 클릭해주고

 

http://localhost:9000/

경로 들어가면 들어가면 잘 나옴

##

기존 -> /hrd/ 필요없어짐

경로숨기기

##

 

 

12.  SampleController 클래스 생성

 

SampleController 

 

 

package com.smart.hrd;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.log4j.Log4j;

@Controller // 컨트롤러가 찾아올 수 있게
@RequestMapping("/sample") //
// 또다른 방법 @RequestMapping("/sample/*")
@Log4j 
public class SampleController {
	
	@RequestMapping("") // 뒤에 경로를 안써주면 /sample 만 적어주면 실행됨
	public void basic() {
		log.info("basic1................................");
	}
}

 

코드작성 후 톰캣서버 실행하고 

http://localhost:9000/sample

접속하면

기초통계

- 머신러닝의 근간이 되는 부분 중 하나이다.

 

 

통계란?

의사결정에 근거적인 뒷받침을 할 수 있게 해준다.




 

통계학이란?

사람들이 궁금해 했던 것
- 불확실한 미래를 예측하고 싶어한다.

과거의 데이터를 가지고 미래를 예측하기 위해 나타난 학문이다.
예측, 숫자

 

학습목표

  • 통개학의 개념
  • 활용분야
  • 통계학용어
  • 미분의 개념

 

통계학과 인공지능의 관계

  • 사람이 데이터를 분석하는 방대한 양의 데이터를 기계가 분석
  • 기계가 효과적으로 분석 미래예측을 위해 인공지능 필요

 

 

통계학이란?

- 과거 자료에 근거하여 불확실한 미래를 대비하기 위해 의사결정을 하고자 하는 학문

- 근거 마련

  • 사용 예시
    • 전쟁이 언제 일어날지
    • 일식이 언제 있을지
    • 어떤 물건을 어느 곳에 파는게 이득일지
    • 전염병확산성에 따른 정책
    • 농작물 풍년일지 흉년일지
      • 어떨 때 흉년일지, 농작물의 질까지 예측
    • 날씨 예측
    • 강수량 %

과거 자료에 근거하여 불확실한 미래를 대비하기 위해 의사결정을 하고자 하는 학문

 

 

활용분야
  • 기본
    • 쓰레기의 양
    • 쌀 생산량
    • 출산율
      • 갈 수록 떨어지고 있다 -> 왜 떨어지고 있는가? -> 양육비, 경제악화, 비혼주의자 상승
  • 통계학의 꽃 - 선거

 

모집단과 표본

  • 모집단 : 관심의 대상이 되는 모든 개체의 관측값이나 측정값의 집합
  • 표본 : 모집단에서 추출한 일부 관측값이나 측정값의 집합
  • 전수조사 : 모집단 전체를 조사하는 것
  • 표본조사 : 표본만 가지고 조사하는 것

 

전수조사와 표본조사

  • 시간과 돈이 너무 많이 든다. 
  • 제대로 된 표본을 확보 하지 않으면 한 쪽으로 쏠린다.

 

질적자료, 양적자료

  • 양적 자료 : 숫자로 표현, 연산가능, 수치형
  • 질적 자료 : 의미가 있는 데이터, 범주형

 

개체, 요인, 변수

  • 개체 : 연구자 또는 관찰자가 관심을 갖는 대상 -> 지원자, 신입사원
  • 요인 : 개체에 관한 특성 중 연구자가 특별히 관심을 갖는 특성 -> 신입사원의 스펙
  • 변수 : 요인을 구성하고 있는 요소 -> 학교성적, 자격증, 경험, 개발능력 등 (스펙을 이루고 있는 각각의 요소)
    • 독립변수 (X, 문제 / 특성 / 입력) : 다른 변수에 영향을 받지 않고, 종속 변수에 영향을 주는 변수 
    • 종속변수 (Y, 정답 / 예측값 / 출력): 종속 또는 의존적인 변수, 독립변수에 영향을 받아서 변화하는 변수
      • 군필 미필이라는 변수에 의해 면접에서 탈락
      • x값의 변화에 따라 y의 값이 변한다.

 

 

 

플로렌스 나이팅게일

  • 정보 : 19세기 영국 간호사이자 통계학자
  • 크리미아 전쟁 때 병원의 위생 상태와 의료 시스템의 문제점을 목격, 위생과 간호에 대한 개선을 주장, 병원의 설계와 운영에 대한 연구를 진행

하늘색 : 질병에 의한 사망자 수

갈색 : 전쟁에 의한 사장자 수

분홍색 : 기타..?

 

도수와 상대도수

 

Boxplot (상자수염 그래프)

  • Median : 중앙값, 홀 수 일때는 편하지만 짝수일땐...
    • 최대값에서 중앙값 절반쪼개고최소값에서 중앙값 절반 쪼개기
  • Outlier : 4분위 값을 넘어가는 이상치

Null 값이 있다면 값을 채워줘야하고

이상치가 있다면 정상적인 값으로 넣어줘야한다.

평균의 오류

-> 자료의 평균값이 전체 자료를 대표하지 못할 때 발생하는 오차이다.

이상치로 인해 평균값이 크게 끌어올려지게 되어 자료를 대표하지 못하는 평균값이 오게 된다.

이런 경우 중앙 값이나 최반 값을 사용하여 대표값을 계산한다.

  • 이상치에 너무 민감하다
  • 허점이 크게 드러날 수 밖에 없다.
  • 데이터 분석에서 중요한 이슈 중 하나이다.

 

편차, 분산, 표준편차

  • 편차 : 관측값들이 평균으로부터 떨어진 거리

  • 분산 : 편차 제곱의 평균 -> 관측값들이 퍼져 있는 정도
    • 제곱의 이유 : 마이너스 값이 있을 수 있어서
    • 평균을 구할 때 모든 값을 더해서 나누는데 음수가 있으면 값이 안맞다.
  • 표준편차 : 분산의 제곱근 -> 제곱된 분산의 스케일을 원래대로 변경
    • 분산 시켜버리면 값이 너무 커져버리니까 다시 돌려주겠다.

 

 

정규분포, 표준정규분포

 

 

산점도 (scatter plot)

  • 상관관계
    • 양의 관계 : x축이 증가할 때 y측도 증가한다.
    • 음의 관계 : x축이 증가할 때 y측도 감소한다.

  • 상관계수
    • 두 변수의 관계하나의 수치로 나타내는 방법
    • 상관계수의 공식

  • -1 에서 1사이의 값을 가지고 있다
  • 0에서 멀어질수록 관계성이 높다
  • 마이너스 기호에 따라 음의 관계인지 양의 관계인지 정해짐

 

미분의 개념
미분이란?

움직이고 변화하는 대상의 "순간적인 변화" 를 설명
즉, 계속해서 변화해 가는 특정한 값을 구하고자 할 때
미분의 실생활 적용이 가능하다.

 

 

 

 

 

 

 

 

 

 

공공데이터포털 사이트

https://www.data.go.kr/

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

 

통계청 사이트

https://www.kostat.go.kr/ansk/

 

통계청

통계청

27.101.222.79

 

도수와 상대도수 실습

 

멀티 컬럼 설정 방법

# 멀티 컬럼 설정
df_rs.columns = [["",'도수','도수','상대도수','상대도수'],
                 ['진로희망','인공지능반','빅데이터반','인공지능반','빅데이터반']]
df_rs

 

 

청 : 한 가지 업무를 담당하는 부서

- 검찰청

- 소방청

- 통계청

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts