머신러닝을 공부했다면!
이정도 알고리즘을 알아야하는것들을 학습&반복했습니다.
솔직히 데이터시각화까지는 바지밑단잡고 질질 끌려가는느낌이었지만 ML들어가면서
수학적인부분이 확실히 들어가다보니 많이 이해하기가 힘들었습니다.
그래서 수업에 그치지않고 유튜브, GPT을 이용해서 조금 더 공부를 해보려고 노력했습니다.
Rent값 예측 모델 만들기
전체 과정
- 데이터 분할: 데이터를 훈련 데이터와 테스트 데이터로 나누기.
- 모델 학습: 훈련 데이터를 사용해 모델을 학습시키기.
- 모델 평가: 테스트 데이터를 사용해 모델이 얼마나 잘 예측하는지 평가하기.
- 예측: 학습된 모델을 사용해 새로운 데이터의 임대료를 예측하기.
으로 구성되어있고 이번 글은 1번에 해당하는 글 입니다.
1. Rent 데이터셋
(따로 받은 데이터셋입니다. 데이터를 이용해서 Rent값을 예측할 수 있는 알고리즘을 만들어 보려고 합니다.
import numpy as np
import pandas as pd
import seaborn as sns
rent_df = pd.read_csv('구글드라이브 마운트~.csv')
rent_df
rent_df.info()
컬럼 확인하기
- Posted On: 매물 등록 날짜
- BHK: 베드, 홀, 키친의 개수
- Rent: 렌트비
- Size: 집 크기
- Floor: 총 층수 중 몇층
- Area Type: 공용공간을 포함하는지, 집의 면적만 포함하는지
- Area Locality: 지역
- City: 도시
- Furnishing Status: 풀옵션 여부
- Tenant Preferred: 선호하는 가족형태
- Bathroom: 화장실 개수
- Point of Contact: 연락할 곳
수치데이터 간단정보 확인
rent_df.describe()
round(rent_df.describe(), 2)
그래프로 확인해보기 (displot)
기준 : BHK
sns.displot(rent_df['BHK'])
기준 : 렌트비
sns.displot(rent_df['Rent'])
3.5라는 x축이 나온 이유는 보이지 않아도 1개라도 데이터가 있다는 뜻 입니다.
실제 3.5에있는 렌트값을 숫자로 확인하기(오름차순)
rent_df['Rent'].sort_values()
이상치 확인하기
sns.boxplot(y=rent_df['Rent']) #1837 데이터는 이상치로 예상
모델에 데이터를 넣을때는 na값을 넣을 수 없기에
na값이 있는지 확인하기
rent_df.isna().sum()
비율로 환산해보기
rent_df.isna().mean()
0.1, 0.06 비율이 null값입니다. 이런 데이터들은 제해주는것도 좋을 것 같습니다.
원하는 행만 Drop하기
rent_df.dropna(subset=['BHK'])
subset을 하게되면 BHK에 NaN이 있는 행만 삭제하게 됩니다.
Size가 na값이 있는 곳의 index를 찍어보기
na_index = rent_df[rent_df['Size'].isna()].index
na_index
사이즈 na값이 있는 값의 size의 평균값을 넣어보기
rent_df['Size'].fillna(rent_df['Size'].median()).loc[na_index]
중간값 판다스ver.
rent_df = rent_df.fillna(rent_df.median(numeric_only=True))
na값이 없어졌는지 확인하기
rent_df.isna().mean()
모든na값에 중앙값을 만들어서 넣어줬습니다.
rent_df.info()
삭제데이터가된 이유
rent_df['Floor'].value_counts()
종류가 480개인데 이런것들은 나중에 하나하나 나누는 방법 보다는 저층,중층,고층 이런식으로 나눈 후 합친다고 합니다
원핫인코딩하기
(여기까지하면 데이터전처리는 다 했다고 보면 됩니다)
rent_df['Area Type'].nunique()
#3
유니크의 숫자를 세어줌
rent_df['Area Type'].unique()
for i in ['Floor','Area Type', 'Area Locality', 'City', 'Furnishing Status', 'Tenant Preferred','Bathroom', 'Point of Contact']:
print(i, rent_df[i].nunique())
몇가지 종류가 있는지 확인할 수 있습니다.
이렇게 함으로서 원핫인코딩을 어떻게 해야할지 그룹을 나눌 수 있는지 등 확인할 수 있습니다.
3개이상인 것들은 원핫인코딩가능합니다. 3개이상인경우에는 관계성이 있다고 생각할 수 있습니다.
100개 미만인것들은 할 수 있습니다. 너무 높은숫자면 가중치가 높아서 비중을 많이 차지하기에 이번경우에는 drop해주겠습니다.
사용하지 않을 데이터 drop
rent_df.drop(['Floor', 'Area Locality', 'Tenant Preferred', 'Point of Contact', 'Posted On'], axis=1, inplace=True)
열을 나타나기에 axis=1로 잡고 바로 적용하기에 인플레이스 true로 했습니다.
rent_df.info()
칼럼이 굉장히 많이 줄었고 데이터들고 일치가 많이 된것같고
서로 관계성을 끊어주기 위해서 object를 끊어줘야하니까 원핫인코딩을 해주겠습니다.
rent_df = pd.get_dummies(rent_df, columns=['Area Type', 'City','Furnishing Status'])
rent_df.head()
모델에 넣기 위해서 독립,종속변수 분할하기
X = rent_df.drop('Rent', axis=1) #독립변수
y = rent_df['Rent'] #종속변수
x=rent만 제거했으니 독립변수가 됩니다.
y=종속변수
모델 학습시키기
데이터 전처리.
트레이닝, 테스트 데이터 나누어주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2024)
test_size=0.2= 20%입니다.
X_train.shape, X_test.shape
#((3796, 15), (950, 15))
y_train.shape, y_test.shape
#((3796,), (950,))
이 결과의 뜻은
- (3796, 15): 3796개의 집 정보를 가지고 모델을 학습시킨다는 뜻이야. 각 집 정보에는 15가지 특징이 포함됨
- (950, 15): 950개의 집 정보를 가지고 모델을 테스트한다는 뜻이야. 각 집 정보에도 15가지 특징이 포함됨.
입니다.
리뷰
학습할 것 | 설명 |
describe() | 간단한 수치데이터 정보 확인 |
round(df..discribe(),2) | 소수점 둘째자리에서 반올림 |
unique() | 갯수를 말해줌 |
nunique() | unique의 숫자를 세어줌 |
'AI 컴퓨터 비전프로젝트' 카테고리의 다른 글
[ML]로지스틱 회귀_승진 될지 안 될지 분류해보기 (2) | 2024.07.07 |
---|---|
[ML] 선형 회귀_Rent값 예측 모델 만들기(2) (0) | 2024.07.04 |
[ML] 아이리스 데이터셋(Iris DataSet) (1) | 2024.07.01 |
[Python] 판다스(pandas) 데이터 프레임 합치기,산술연산, 원핫인코딩 등 (1) | 2024.06.18 |
[Python] 판다스(pandas)를 이용한 데이터 다루기 (0) | 2024.06.14 |