2.1 실제 데이터로 작업하기
유명한공개 데이터 저장소
- OpenML(https://openmLorg)
- 캐글(https://kaggle.com/datasets)
- PapersWithCode (https://paperswithcode. com/datasets)
- uc 어바인 머신러닝 저장소 (https://archive.ics.uci.edu/mI)
- 아마존 AWS 데이터셋 (https://registry.opendata.aws)
- 먼서플로 데이터셋 (https://tensorflow.org/datasets)
메타 포털(공개 데이터 저장소가 나열되어 있는 페이지)
- 데이터 포털 (https://dataportals.org)
- 오픈 데이터 모니터 (https://opendatamonitor.eu)
인기 있는공개 데이터가 나열되어 있는 다른페이지
- 위키백과 머신러닝 데이터셋 목록 (https://homl.info/9)
- Quora (https: / /hom 1. info/10)
- 데이터셋 서브레덧 subreddit *(https://www.reddit.com/r/datasets* )
StatLib 저장소에 있는 캘리포니아 주택 가격 California-Housing Prices 데이터셋을 사용한다.
- 데이터셋은 1990년 캘리포니아 인구 조사 데이터를 기반으로 함
https://www.kaggle.com/datasets/camnugent/california-housing-prices
2.2 큰그림 보기
- 인구 조사 데이터를 시용해 캘리포니아의 주택 가격 모델을 만들어야함
- 데이터는 캘리포니아의 블록 그룹마다 인구, 중간소득, 중간 주택 가격 등을담고 있음.
- 블록 그룹은 미국 인구 조사국에서 샘플 데이터를 발표하는 데 사용하는 최소한의 지리적 단위임
- 하나의 블록 그룹은 보통 600~3000명의 인구임
- 데이터로 모델을 학습함
- 다른 측정 데이터가 주어졌을 때 구역의 중간 주택 가격을 예측함.
2.2.1 문제정의
캘리포니아 인구 조사 데이터를 시용해 캘리포니아의 주택 가격 모델을 만들고 다른 측정 데이터가 주어졌을 때 구역의 중간 주택 가격을 예측하는 것이 최종 목표이다.
모델 목적 정의 및데이터 분석
- 모델의 목적을 아는 것은 문제의 구성과 알고리즘 선택, 모델 평가 지표 결정에 기여한다.
- 머신러닝의 목표는 구역의 중간 주택 가격을 예측하는 것이며, 이 예측은 이후 투자 결정에 활용된다.
- 모델의 출력이 다른 머신러닝 시스템에 입력으로 사용될 때, 뒤따르는 시스템은 해당 지역에 투자할 가치가 있는지 결정한다. 이 입력이 수익과 직결된다.
- 수동으로 주택 가격을 추정하는 것은 비용과 시간이 많이 들며 정확도도 낮다.
- 인구 조사 데이터와 다른 데이터를 포함한 주택 가격 데이터를 사용하여 모델을 훈련한다.
- 이 문제는 지도학습(훈련 데이터에 레이블이 있음)이며, 정확히는 여러 특성을 기반으로 주택 가격을 예측하므로 다중 회귀 문제이며, 각 구역의 중간 주택 가격을 예측하므로 단변량 회귀 문제로 분류된다.
- 데이터가 메모리에 충분히 들어갈 만큼 작고, 실시간 데이터가 아니므로 배치 학습이 적절하다.
2.2.2 성능 측정 지표 선택
회귀 문제의 전형적인 성능 지표는 평균 제곱근 오차이다.
평균 제곱근 오차(RMSE)는 회귀 예측 모델에 대한 두 개의 주요 성과 지표 중 하나로, 평균 제곱근 오차는 예측 모델에서 예측한 값과 실제 값 사이의 평균 차이를 측정한다. 예측 모델이 목표 값(정확도)을 얼마나 잘 예측할 수 있는지 추정한다.
머신러닝 분야의 대표적인 표기법
- m은 RMSE를 측정할 데이터셋에 있는 샘플 수를 말한다.
- x^(i)는 데이터셋에 있는 j번째 샘플(레이블 제외)의 전체 특성값의 벡터이고, y^(i)는 해당 레이블(해당 샘플의 기대 출력값)이다.
- X는 데이터셋에 있는 모든 샘플의 모든 특성값(레이블은 제외)을 포함하는 행렬이다.
- h는 시스템의 예측 함수이며 가설이라고도 한다.
- RMSE(X,h)는 가설 h를 시용하여 일련의 샘플을 평가하는 비용 함수이다.
- 스킬라값이나 함수를 나타낼 때는 m이나 y^(i) 또는 h와같이 기울어진 소문자, 벡터를 나타낼 때는 x^(i)와 같이 굵은 소문자, 행렬을 나타낼 때는 X와 같이 굵은 대문자를 사용한다.
RMSE는 일반적으로 회귀 문제에서 선호되는 성능 측정 방법이지만 경우에 따라 다른 함수 를 사용할 수도 있다. 예를 들어 이상치로 보이는 구역이 많다면 평균 절대 오차를 고려해볼만 하다.
2.2.3 가정검사
가정을 나열하고 검토하는 것은 중요한 과정이다. 이를 통해 심각한 문제를 조기에 발견할 수 있다. 예를 들어, 시스템이 가격 대신 카테고리(‘저렴’, ‘보통’, ‘고가’)를 사용하는 경우, 회귀가 아닌 분류 작업이 필요하게 된다. 따라서 하위 시스템에서 실제 가격을 사용하는지 확인하는 것이 중요하다.
2.3 데이터 가져오기
2.3.3 대화식 환경의 편리함과 위험
주피터 노트북은 매우 유연하고 인터랙티브한 환경을 제공한다. 각 셀을 개별적으로 실행하고, 중간에 새로운 셀을 추가하거나 이전 셀로 돌아가 실행할 수 있다. 이러한 방식으로 주피터 노트북을 활용하는 것이 좋다. 그러나 유연성에는 대가가 따르며, 셀을 잘못된 순서로 실행하거나 실행을 놓치기 쉬워 오류가 발생할 수 있다. 특히, 패키지 임포트 등 설정 코드가 포함된 첫 번째 셀은 반드시 먼저 실행해야 한다.
2.3.5 데이터 다운로드
데이터 다운로드는 일반적으로 보안 자격과 접근 권한이 필요하며, 데이터 구조를 이해해야 한다.
하지만 이 프로젝트는 간단하여, 모든 데이터가 CSV 파일에 들어있다. 데이터를 수동으로 내려받는 대신, 이를 자동화하는 함수를 작성하는 것이 더 효율적이다. 특히 데이터가 자주 변경되는 경우나 여러 기기에 데이터를 설치해야 할 때 유용하다.
from pathlib import Path
import pandas as pd
import tarfile
import urllib.request
def load_housing_data():
tarball_path = Path("datasets/housing.tgz")
if not tarball_path.is_file():
Path("datasets").mkdir(parents=True, exist_ok=True)
url = "<https://github.com/ageron/data/raw/main/housing.tgz>"
urllib.request.urlretrieve(url, tarball_path)
with tarfile.open(tarball_path) as housing_tarball:
housing_tarball.extractall(path="datasets")
return pd.read_csv(Path("datasets/housing/housing.csv"))
housing = load_housing_data()
- 파일 확인: datasets/housing.tgz 파일이 있는지 확인한다.
- 파일 다운로드: 파일이 없으면 깃허브에서 다운로드하고 /content에 압축을 푼다.
- 데이터 로드: datasets/housing 디렉터리의 housing.csv 파일을 판다스 데이터프레임으로 로드한다.
- 반환: 데이터프레임을 반환한다.
2.3.6 데이터 구조 훝어보기
head(n=5): 데이터프레임의 상위 n개의 행을 반환한다.
tail(n=5): 데이터프레임의 하위 n개의 행을 반환한다.
info: 메서드 그 자체를 나타낸다. 메서드 객체에 대한 참조를 반환한다.
info(): 메서드를 호출하여 실제로 실행한다. 데이터프레임의 요약 정보를 출력한다.
describe(): 수치형 데이터의 통계적 요약을 제공한다. 평균, 표준편차 등.
shape: 데이터프레임의 행과 열의 수를 반환한다.
columns: 데이터프레임의 열 이름을 반환한다.
dtypes: 각 열의 데이터 타입을 반환한다.
value_counts(): 시리즈에서 고유 값의 개수를 계산한다.
dropna(): 결측치를 포함하는 행 또는 열을 제거한다.
fillna(value): 결측치를 특정 값으로 대체한다.
sort_values(by): 지정한 열을 기준으로 데이터프레임을 정렬한다.
groupby(by): 지정한 열을 기준으로 그룹화하여 집계 작업을 수행한다.
housing.**columns**//데이터프레임의 열 이름을 반환
Index(['longitude', 'latitude', 'housing_median_age', 'total_rooms','total_bedrooms', 'population', 'households', 'median_income','median_house_value', 'ocean_proximity'],dtype='object')
housing.**shape**//데이터프레임의 행과 열의 수를 반환
(20640, 10)
total_bedrooms 특성은 20,433개만 널값이 아니다. 207개의 구역은 이 특성을 가지고 있지 않다는 뜻이다.
housing.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 20640 entries, 0 to 20639 Data columns (total 10 columns):
Column Non-Null Count Dtype
0 longitude 20640 non-null float64 1 latitude 20640 non-null float64 2 housing_median_age 20640 non-null float64 3 total_rooms 20640 non-null float64 4 total_bedrooms 20433 non-null float64 5 population 20640 non-null float64 6 households 20640 non-null float64 7 median_income 20640 non-null float64 8 median_house_value 20640 non-null float64 9 ocean_proximity 20640 non-null object dtypes: float64(9), object(1) memory usage: 1.6+ MB
ocean_proximity 필드를 제외한 모든 특성은 숫자형이다. ocean_proximity 필드는 데이터 타입이 object이며, 텍스트 특성일 가능성이 높다. 값이 반복되는 것을 보아 범주형 특성으로 보인다. value_counts() 메서드를 사용해 카테고리와 각 카테고리별 구역 수를 확인할 수 있다.
housing["ocean_proximity"].value_counts()
ocean_proximity <1H OCEAN 9136 INLAND 6551 NEAR OCEAN 2658 NEAR BAY 2290 ISLAND 5 Name: count, dtype: int64
housing.describe()
count, mean, min, max는 각 통계 값의 의미를 쉽게 알 수 있다. 널값은 제외되었으며, std는 표준 편차를 나타낸다. 25%, 50%, 75%는 백분위수를 의미하며, 각각 하위 25%, 50%, 75%에 속하는 값을 나타낸다. 예를 들어, 25%의 구역은 housing_median_age가 18보다 작고, 50%는 29보다 작으며, 75%는 37보다 작다.
데이터의 숫자형 특성을 빠르게 검토하는 방법 중 하나는 히스토그램을 그리는 것이다. 히스토그램은 특정 값 범위에 속하는 샘플 수를 시각적으로 보여준다.
개별 특성마다 히스토그램을 그릴 수 있지만, hist() 메서드를 사용하면 전체 데이터셋에 대해 모든 숫자형 특성의 히스토그램을 한 번에 출력할 수 있다.
import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(12, 8))
plt.show()
0 longitude 20640 non-null float64 1 latitude 20640 non-null float64 2 housing_median_age 20640 non-null float64 3 total_rooms 20640 non-null float64 4 total_bedrooms 20433 non-null float64 5 population 20640 non-null float64 6 households 20640 non-null float64 7 median_income 20640 non-null float64 8 median_house_value 20640 non-null float64 9 ocean_proximity 20640 non-null object
matplotlib.pyplot 주요 메서드
plot(): 선 그래프 그리기.
scatter(): 산점도 그리기.
hist(): 히스토그램 그리기.
bar(): 막대 그래프 그리기.
xlabel(): x축 레이블 설정.
ylabel(): y축 레이블 설정.
title(): 그래프 제목 설정.
legend(): 범례 추가.
show(): 그래프 화면에 표시.
subplots(): 여러 그래프 배치.
'Python > [머신러닝]' 카테고리의 다른 글
4주차: 모델 훈련 (0) | 2024.10.01 |
---|---|
3주차: 분류 (1) | 2024.09.24 |
1주차 : CH1 한눈에 보는 머신러닝 (9) | 2024.09.10 |