TIL 58일차 : 데이터 분할 (훈련용/평가용) > 스케일러 적용 해보기
✏️도전한 점 (목요일)
- 기초학습 코드카타 풀이
- 구글슬라이드를 이용한 프레젠테이션 작업
- 파이썬 코드카타 개별적 풀이
- 점프투파이썬 팀스터디 (1시간)
- 저녁으로 태어나서 처음으로 김피탕 먹기
01 훈련용train데이터와 평가용test데이터의 구분
1. scikit-learn 라이브러리 소환
from sklearn.preprocessing import StandardScaler
2. 특성 데이터를 위한 스케일러 인스턴스 생성
scaler = StandardScaler()
3. 특성 데이터에 대해 피팅(학습) 및 변환 수행
X_scaled = scaler.fit_transform(X)
4. 훈련 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
💡잠깐! 선행학습을 하자면, 데이터의 특성(feature)이란?
데이터를 설명하는 데 사용되는 개별적인 속성이나 변수를 나타낸다. 데이터셋의 각 행은 관측치를 나타내고, 각 열은 특성을 나타냅니다. 예를 들어, 주택 가격을 예측하는 데이터셋에서 특성은 주택의 크기, 위치, 건축 연도, 침실 수, 욕실 수 등이 될 수 있다.
특성은 예측 모델의 입력 변수로 사용되며, 모델이 특정 특성의 값을 입력으로 받아 원하는 출력을 예측하게 된다. 이러한 특성은 데이터를 이해하고 모델링하는 데 중요한 역할을 한다. 특성을 잘 선택하고 이해하면 모델의 예측 성능을 향상시키고 데이터에 대한 통찰력을 얻는 데 도움이 된다.
💡잠깐! 스케일러를 "적용하지 않은" 과정은?
훈련용과 평가용 데이터를 분리하는 과정은 모델 학습을 위한 데이터 준비 단계이다. 여기서 추가된 스케일링은 데이터 전처리 과정 중 하나로 본다. 따라서 둘은 서로 다른 과정이지만 데이터 분리 과정에서 스케일링을 포함하여 전처리를 수행할 수 있다.
개념: 훈련용, 평가(테스트) 데이터로 구분하는 과정은 일반적으로 머신러닝에서 데이터 전처리 과정 중 하나인 "스케일링"을 수행하는 과정을 담고 있다. 여기서는 표준화(Standardization)를 사용하고 있으며, 데이터의 각 특성(feature)을 평균이 '0'이고 표준 편차가 '1'인 분포로 변환하는 과정이라고 이해하면 된다.
1. from sklearn.preprocessing import StandardScaler: 우선 StandardScaler 클래스를 sklearn.preprocessing 모듈에서 가져오는 과정. 이 클래스는 데이터를 표준화하는데 사용된다.
2. scaler = StandardScaler(): StandardScaler 클래스의 인스턴스를 생성한다. 이 인스턴스는 후에 데이터를 표준화할 때 사용될 것이다.
3. X_scaled = scaler.fit_transform(X): fit_transform 메서드를 사용하여 특성 데이터(X)를 표준화한다. 이 과정은 특성 데이터를 표준화된 형태로 변환하고, 그 결과를 X_scaled에 저장한다. 주어진 데이터의 평균과 표준 편차를 계산하여 이를 사용해 표준화를 수행하게 된다.
4. X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42): 표준화된 특성 데이터(X_scaled)와 타깃 데이터(y)를 train_test_split 함수를 사용하여 훈련 세트와 테스트 세트로 분할한다. 이 함수는 데이터를 주어진 비율에 따라 무작위로 나누는 역할을 한다. 여기서 test_size=0.2는 전체 데이터 중 테스트 세트의 비율을 나타내며, random_state=42는 분할 과정에서의 랜덤 시드를 고정시켜 재현 가능한 결과를 얻기 위한 것이다.
결론: 이러한 과정을 통해 데이터의 스케일을 조정하고, 훈련 세트와 테스트 세트로 나누어 모델 학습과 평가를 위한 준비를 마치게 된다.
4. X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
train_test_split 함수: 데이터를 훈련 세트와 테스트 세트로 분할하는데 사용된다. 이를 통해 모델의 성능을 평가할 때, 테스트 데이터를 사용하여 모델을 평가하고, 훈련 데이터를 사용하여 모델을 학습한다. 이 과정은 다음과 같이 진행된다.
1. X_scaled와 y: 표준화된 특성 데이터(X_scaled)와 해당하는 타깃 데이터(y)를 인자로 받는다.
2. test_size=0.2: 이 인자는 전체 데이터를 훈련 세트와 테스트 세트로 나눌 때, 테스트 세트의 비율을 나타낸다. 여기서는 전체 데이터 중 20%를 테스트 세트로 사용하도록 설정한 것이다.
3. random_state=42: 이 인자는 분할 과정에서의 랜덤 시드를 설정한다. 시드를 설정하면 무작위 분할 과정에서도 항상 동일한 결과를 얻을 수 있다. 즉, 같은 시드를 사용하면 항상 같은 데이터가 같은 방식으로 나눠진다. 이것은 실험 결과를 재현할 때 유용하다.
4. X_train, X_test, y_train, y_test: train_test_split 함수의 반환값으로, 각각 훈련 세트와 테스트 세트의 특성 데이터와 타깃 데이터를 나타낸다. 즉, X_train과 y_train은 훈련 세트의 특성 데이터와 타깃 데이터이며, X_test와 y_test는 테스트 세트의 특성 데이터와 타깃 데이터이다.
결과: 이렇게 훈련 세트와 테스트 세트로 나누어주는 것은 모델을 학습하고 검증하는 과정에서 편향된 결과를 얻지 않고, 모델의 일반화 성능을 평가하는 데 도움이 된다.
Q. 각각 데이터프레임 4개가 생성된 것으로 이해하면 되나?
A. 맞다. train_test_split 함수의 반환값은 총 4개의 데이터 집합으로 이루어져 있다. 각각은 훈련 세트와 테스트 세트의 특성 데이터와 타깃 데이터를 의미한다.
- X_train: 훈련 세트의 특성 데이터를 나타낸다. 이것은 모델을 학습시키는 데 사용된다.
- X_test: 테스트 세트의 특성 데이터를 나타낸다. 이것은 모델의 성능을 평가하는 데 사용된다.
- y_train: 훈련 세트의 타깃 데이터를 나타낸다. 이것은 모델을 학습시키는 데 사용된다.
- y_test: 테스트 세트의 타깃 데이터를 나타낸다. 이것은 모델의 성능을 평가하는 데 사용된다.
따라서 각각의 데이터프레임에는 훈련 세트와 테스트 세트의 데이터가 포함되어 있는게 맞다. 이런 분할은 모델의 학습과 성능 평가를 위해 필요한 데이터를 적절히 확보하는 데 도움이 된다.
Q. 데이터 집합의 type이 무엇인가?
A. 데이터 집합의 type은 'pandas DataFrame' 이 맞다. 데이터프레임은 행과 열로 구성된 2차원 데이터 구조를 갖추고 있으며, 각 열은 서로 다른 데이터 타입을 가질 수 있습니다. 이러한 특징으로 데이터프레임은 데이터를 보다 유연하게 조작하고 분석할 수 있는 강력한 도구로 널리 사용된다.
Q. 데이터프레임과 시리즈의 차이
A. 시리즈(Series)는 데이터프레임의 한 열이나 한 행을 나타내는 1차원 데이터 구조로, 인덱스(index)와 해당하는 값(value)으로 구성되어 있다. 데이터프레임에서 하나의 행을 추출하면 시리즈가 생성되고, 이 시리즈는 해당 행의 인덱스와 값으로 구성된다. 마찬가지로 데이터프레임의 한 열을 추출하면 해당 열의 모든 값이 시리즈로 반환된다.
따라서 데이터프레임은 여러 열과 행으로 구성된 2차원 데이터 구조이며, 시리즈는 한 열이나 한 행의 데이터를 담고 있는 1차원 데이터 구조이다.
Q. 동일한 조건으로 random하게 데이터를 추출했다로 이해하면 되나?
A. 맞다. 동일한 조건으로 random하게 데이터를 추출한 것이다. 이 과정은 재현성을 보장하기 위해 사용되며, random_state 매개변수를 사용하여 난수 생성의 초기 상태를 지정함으로써 가능하게 된다. 동일한 random_state를 사용하면 항상 동일한 결과를 얻을 수 있다.
Q. 이런 과정이 필요한 이유에 데이터가 무거워서인 것도 해당되나?
A. 아니다. 동일한 조건으로 random하게 데이터를 추출하는 이유는 결과를 재현할 수 있도록 하기 위함이다. 데이터 분석이나 머신러닝 모델 학습 등에서 random한 요소가 포함되는 경우, 동일한 결과를 얻기 위해 동일한 조건으로 random하게 데이터를 추출하는 것이 매우 중요하다. 이는 실험 결과의 일관성을 유지하고 모델의 성능을 신뢰할 수 있도록 한다.
Q. 그냥 row 데이터를 사용해도 되지 않나?
A. 조건부 맞다. 데이터가 충분히 작거나 데이터셋이 잘 섞여 있을 때는 그냥 row 데이터를 사용해도 된다. 그러나 데이터셋이 크거나 데이터가 불균형하게 분포되어 있거나 특정 패턴이 존재할 때는 random하게 데이터를 추출하여 사용하는 것이 더 바람직할 수 있다. 이것은 모델의 일반화 성능을 높이고 결과를 더 신뢰할 수 있도록 도와준다.
Q. 데이터 분포가 불균형할 때를 대비해서 그렇게 하는 거라고 이해했다 맞나?
A. 맞다. 데이터가 불균형하게 분포되어 있을 때는 특정 클래스나 범주의 데이터가 다른 것보다 훨씬 많을 수 있다. 이 경우 모델이 편향되어 희귀 클래스나 범주를 더 잘 인식하지 못할 수 있다. 따라서 데이터를 무작위로 추출하여 균형을 맞추는 것이 중요하다. 이렇게 하면 모델이 각 클래스나 범주를 더 골고루 학습할 수 있고, 불균형한 데이터의 영향을 줄일 수 있다.
Q. 랜덤으로 추출하는게 균형을 맞추는 것이라니 매우 유용한 기능이다.
A. 맞다. 데이터를 무작위로 추출하는 것은 균형을 맞추는 한 가지 방법이 된다. 특히 불균형한 데이터셋에서는 모델이 희귀 클래스나 범주를 더 잘 학습할 수 있도록 도와준다. 물론 다른 방법도 있을 수 있지만, 무작위 샘플링은 비교적 간단하고 직관적인 방법 중 하나이기에 실습 과정에서 많이 사용하고 있는 것으로 보인다. (추측!)
02 머신러닝 프로젝트 프리젠테이션 제작
02 점프투파이썬 팀스터디 16시 4장 되새김 문제
점프투파이썬 스터디 4장 되새김 문제 (tistory.com)
점프투파이썬 스터디 4장 되새김 문제
1번 문제 def is_odd(number): if number % 2 == 0: return True else: return False is_odd(2) 2번 문제 def avg_number(*args): # 몇 개를 넣어도 튜플이 된다. result = 0 for i in args: result += i return result / len(args) avg_number(1, 2) 3번
specialda.tistory.com
03 파이썬 코드카타 11~15, 16번~21번 1차 구현
파이썬 코드카타 13번~15번: 자릿수 더하기, 알고리즘적 풀이 (tistory.com)
파이썬 코드카타 13번~15번: 자릿수 더하기, 알고리즘적 풀이
문제 13. 자릿수 더하기 작성 코드 def solution(n): answer = 0 n = str(n) for i in n: answer += int(i) return answer 해설 코드(1) 해설코드(2) 시간 측정 라이브러리를 사용하여 효율 비교 문제 14. 약수의 합 작성 코
specialda.tistory.com
파이썬 코드카타 16번~20.5번 (tistory.com)
파이썬 코드카타 16번~20.5번
💡인사이트 16번은 구구단이라고 생각하니까 빨리 풀렸다. 17번은 answer.reverse() 사용했다. 19번은 2제곱을 i ** i 로 착각해서 시간이 걸렸다. 20번은 .sort(), .reverse(), .join()을 사용했다. 21번 하샤드
specialda.tistory.com