화이트 모드로 보시길 권장합니다
이 글은 [kaggle Learn Courses] 시리즈로
kaggle에서 제공하는 Data Science가 되기 위한 기술을 배울 수 있는
" Learn Courses "에 대한 내용을 정리한 글이다.
데이터셋 준비
Melbourne Housing Snapshot
" Melbourne Housing Snapshot "데이터셋은 kaggle에서 제공하는 자료로 아래 링크에서 다운로드할 수 있다.
https://www.kaggle.com/datasets/dansbecker/melbourne-housing-snapshot
Melbourne Housing Snapshot
Snapshot of Tony Pino's Melbourne Housing Dataset
www.kaggle.com
데이터셋 설명 :
" Melbourne Housing Snapshot "데이터셋은 'Tony Pino'가 제작한 데이터셋이다.
' Domain.com.au '에서 제공하는 데이터를 이용해 만든 데이터셋이다.
주소, 부동산 유형, 주거 지역, 판매 방법, 방, 가격, 부동산 중개인, 판매 날짜, C.B.D(중심업무지구)와의 거리데이터가 포함되어 있다.
데이터셋 준비
데이터셋을 다운로드한 후 원하는 폴더로 옮겨준 뒤, jupyter notebook을 실행시킨다.
( 환경 준비 방법에 대한 내용은 아래 글에서 확인할 수 있다. )
[분류 전체보기] - [kaggle : Machine Learning] 0. Python 설치와 가상환경 준비
[kaggle : Machine Learning] 0. Python 설치와 가상환경 준비
화이트 모드로 보시길 권장합니다 이 글은 [kaggle Learn Courses] 시리즈로 kaggle에서 제공하는 Data Science가 되기 위한 기술을 배울 수 있는 " Learn Courses "에 대한 내용을 정리한 글이다. 환경 준비 Python
smcjungbumc.tistory.com
jupyter notebook 셀에서 아래 명령어를 입력해 pandas라이브러리를 다운로드하여 준다.
!pip install pandas
아래 코드를 다음 셀에 입력해 다운로드한 pandas 라이브러리를 " pd "라는 이름으로 지정한다.
import pandas as pd
다운로드한 데이터셋을 Python에서 사용해야 한다.
kaggle에서는 데이터셋의 경로를 변수에 저장한 후 불러온다. 하지만 필자는 데이터셋을 Python에서 변수에 저장하면 그 후부턴 데이터셋의 경로가 필요하지 않다고 생각되어 경로를 따로 저장하지 않았다.
melb_data = pd.read_csv('../data/melb_data.csv') # 데이터셋 불러옴
melb_data.describe() # 5가지 요약수치를 보여준다
위 코드에서 describe() 함수는 칼럼별 데이터의 개수, 평균, 표준편차, 5가지 요약 수치를 보여준다.
count : 컬럼별 데이터의 개수
mean : 평균
std( Standard Deviation ) : 표준편차
5가지 요약 수치 : 최솟값(min), 제1 사분위 수(25%), 중앙값(50%), 제3 사분위 수(75%), 최댓값
melb_data.columns # 각 컬럼의 이름 출력
melb_data['Type'].unique() # 컬럼의 총 개수 출력
위 코드를 통해 " Melbourne Housing Snapshot " 데이터셋에는 총 21개의 데이터셋이 있는 것을 파악할 수 있다.
[
'Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',
'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',
'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',
'Longtitude', 'Regionname', 'Propertycount'
]
각 칼럼의 이름은 위와 같으며 칼럼별 데이터의 뜻은 아래 " 더 보기 "를 클릭하여 확인할 수 있다.
Suburb : 주택이 위치한 동
Address : 주택의 주소
Rooms : 주택에 있는 방의 개수
Type : 주택의 종류를 의미하며 실제 데이터 셋에는 h, u, t만 존재하기에 이 세 가지에 대해서만 정리하겠다.
h - 주택(house), 오두막집(cottage), 빌라(villa), 다가구주택(semi), 테라스(terrace)
u - 2~3층 다세대 아파트(unit), 듀플렉스하우스(duplex)
t - 연립주택(townhouse)
Price : 가격
Method : 주택의 부동산 상태를 의미한다.
S - 매각된 부동산 SP - 이전에 판매된 부동산; PI - 속성이 전달되었습니다. PN - 공개되지 않은 사전 판매; SN - 공개되지 않은 판매; NB - 입찰 없음; VB - 공급업체 입찰; W - 경매 전에 철회; SA - 경매 후 판매; SS - 경매 가격 미공개 후 판매. N/A - 가격 또는 최고 입찰가를 사용할 수 없습니다.
SellerG : 부동산 중개인
Date : 판매 날짜
Distance : C.B.D와의 거리
Postcode : 우편번호
Bedroom2 : 'Domain.com.au'이외의 사이트에서 가져온 방 정보
Bathroom : 화장실 개수
Car : 자동차 주차 공간의 수
Landsize : 토지 면적
BuildingArea : 건물 크기
YearBuilt : 건축 연도
CouncilArea : 지역 행정 구역
Lattitude : 위도
Longtitude : 경도
Regionname : 지역 이름
Propertycount : 재산수
melb_data_notnull.isnull().sum()
isnull은 결측치를 판별하는 함수로 위 코드를 이용해 각 칼럼의 결측치 개수를 확인한 결과
Car 62
BuildingArea 6450
YearBuilt 5375
CouncilArea 1369
위 4개의 칼럼에 결측치가 포함되어 있는 것을 확인할 수 있다.
데이터셋을 이용해 모델을 학습시키기 위해선 결측치를 제거한 후 학습에 사용해야 한다.
결측치가 있을 경우 데이터의 정확한 분석이 어려우며 모델의 정확도가 떨어지게 된다.
결측치를 제거하는 방법으론 결측치를 평균, 중앙값으로 대체하는 방법 등이 있다.
kaggle에서는 결측치가 포함된 전체 행을 제거하는 방법을 사용했기에 필자도 같은 방법을 사용하겠다.
melb_data_notnull = melb_data.dropna(axis=0)
dropna 함수는 결측치를 제거하는 함수로, 위 코드를 이용해 결측치가 포함된 전체 행을 제거할 수 있다.
axis를 0으로 설정하면 결측치가 포함된 전체 행이 삭제되며 1로 설정하면 전체 열이 삭제되게 된다.
kaggle 주택 가격 예측 모델 만들기
모델 학습을 위한 준비
주택의 가격을 예측하는 모델을 만드는 것으로 Scikit Learn의 의사결정트리를 이용해 모델을 학습시킨다.
Scikit Learn은 Python을 대표하는 머신러닝 라이브러리이다.
의사결정트리( Decision Tree Regressor ) :
분류와 회귀 분석 방법이 모두 가능한 지도 학습 방법이다.
데이터 규칙을 학습해 트리를 기반으로 하는 분류 규칙을 만든다.
!pip install scikit-learn
위 코드를 통해 Scikit Learn 라이브러리를 다운로드한다.
다운로드한 Scikit Learn 라이브러리의 의사결정트리를 사용하기 위해 Python에서 다운로드한 라이브러리를 불러온다.
from sklearn.tree import DecisionTreeRegressor
위 코드를 통해 라이브러리를 Python에서 불러온다.
주택의 가격을 예측하는 모델을 만드는 것이므로 예측값(정답값)인 칼럼 ' Price '를 변수 y에 저장해야 한다.
머신러닝은 모델을 학습시키기 위해 사람이 직접 특징을 선택해 줘야 한다.
딥러닝은 스스로 특징을 선택해 학습한다.
y = melb_data_notnull.Price # y = melb_data_notnull['Price']와 같다
위 코드를 통해 칼럼 ' Price '를 변수 y에 저장한다.
데이터셋에서 가격에 영향을 미치는 특징(feature)을 추출해 모델을 학습시켜야 한다.
kaggle에서는 아래 4가지를 특징으로 추출하였기 때문에 필자 또한 같은 칼럼을 특징으로 추출하겠다.
['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
아래 코드를 통해 가격에 영향을 주는 특징을 추출하여 변수 X에 따로 저장한다.
X = melb_data_notnull[['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']]
모델 학습
의사결정트리를 이용해 모델을 만드는 것이기에 Scikit 라이브러리의 ' DecisionTreeRegressor '을 이용해 모델을 만든다.
melb_model = DecisionTreeRegressor(random_state=1)
위 코드를 이용해 의사결정트리 방식의 모델 ' melb_model '을 만든다.
random_state는 모델을 만들 때 생성하는 난수의 시드를 설정하는 것이다.
같은 학습 방법과 데이터셋을 이용해도 시드가 다를 경우 학습 결과가 다르게 나올 수 있다.
아래 코드를 이용해 미리 만들어둔 정답값 변수 y와 추출한 특징이 담긴 변수 x를 이용해 모델을 학습시킨다.
melb_model.fit(x, y)
fit은 모델을 학습시키는 변수이다.
모델을 학습시켰다면 모델이 학습이 잘 되었는지, 예측을 잘하는지 확인해야 한다.
melb_model.predict(x.head())
위 코드를 이용해 학습된 모델의 예측값을 확인할 수 있다.
모델의 예측값은 아래와 같이 나왔으며 실제 가격과 비교해 봤을 때 가격 예측을 잘한다 생각할 수 있다.
예측값 : 1035000., 1465000., 1600000., 1876000., 1636000.]
실제값 :
1 1035000.0
2 1465000.0
4 1600000.0
6 1876000.0
7 1636000.0
하지만 이는 데이터의 일부 값만을 비교한 것이다.
아래 코드를 통해 모델의 평균절대오차값을 확인할 수 있다.
( 평균절대오차와 관련된 내용은 아래 링크에서 확인할 수 있다. )
[AI Friends School] - [AI Friends School 5차시] 인공지능의 성능 평가 및 개선 방법
[AI Friends School 5차시] 인공지능의 성능 평가 및 개선 방법
화이트 모드로 보시길 권장합니다 [AI Friends School] 시리즈는 MicroShcool에서 진행하는 온라인 인공지능 학습 학교이다. AI Friends School 강의 내용을 말하기 전, AI Friends School에선 어떠한 것을 배우는
smcjungbumc.tistory.com
melb_predict = melb_model.predict(x) # 예측값을 변수에 저장
true_y = melb_data_notnull['Price'] # 실제 값을 변수에 저장
from sklearn.metrics import mean_absolute_error # MAE를 계산할 수 있는 함수
mean_absolute_error(true_y, melb_predict) # MAE 계산 함수를 이용해 값 계산
위 코드를 통해 평균절대오차값을 계산한 결과 아래와 같은 값이 나왔다.
1115.7467183128902
오차값이 0에 가까울 수록 좋은 것이지만, ' melb_model '은 오차값이 높기에 잘 만들어진 모델이라 할 수 없다.
이 경우 가격에 영향을 주는 특징을 잘못 추출한 것이다.
필자가 만든 모델
필자는 가격에 영향을 주는 특징 칼럼을 아래와 같이 선택하였다.
( string이 포함된 칼럼을 추가하니 학습하는데 오류가 발생해 아래와 같이 선택하였다 )
['Rooms', 'Distance', 'Car', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude', 'Longtitude']
위와 같이 특징을 재추출 하여 변수 X에 저장한 후 모델을 다시 학습시켜 보겠다.
features = ['Rooms', 'Distance', 'Car', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude', 'Longtitude']
jb_X = melb_data_notnull[features]
jb_melb_model = DecisionTreeRegressor(random_state=1)
jb_melb_model.fit(jb_X, y)
위 코드를 이용해 모델을 다시 만든 뒤 필자가 추출한 특징을 가지고 모델을 학습시켰다.
필자가 만든 모델의 평균절대오차를 계산한 결과 아래와 같은 값이 나왔다.
필자 모델 MAE : 433.1020012911556
melb_model MAE : 1115.7467183128902
MAE값이 절반 이상 줄어든 것을 확인할 수 있었다.
아직 배우는 단계라 오늘 배운 방법으로 밖에 모델을 못 만들기에
Suburb, Type과 같은 String데이터를 모델 학습에 사용하지 못한 점이 아쉽다.
'kaggle > Learn-Machine Learning' 카테고리의 다른 글
[kaggle : Machine Learning] 2. 과대적합과 과소적합 (0) | 2023.02.07 |
---|