자동차 가격예측
데이터 로드
In [1]:
import pandas as pd
data = pd.read_csv('Automobile_data_.csv')
In [2]:
data.head()
Out[2]:
- 결측값 변경 “?” -> NAN
In [65]:
import numpy as np
data = data.replace('?',np.NaN)
data.head()
Out[65]:
In [53]:
data.info()
In [54]:
data.describe()
Out[54]:
- 프라이스 변수 연속형으로 변경
In [58]:
data['price'] = pd.to_numeric(data['price'])
- 연속형 변수 파악
In [59]:
cols = data.columns #전체칼럼명
num_cols = data._get_numeric_data().columns
num_cols = list(num_cols) #연속형변수
num_cols
Out[59]:
- 이산형 변수 파악
In [60]:
cate_cols = list(set(cols) - set(num_cols)) #이산형변수
cate_cols
Out[60]:
- 연속형 변수 EDA
In [61]:
data.hist(bins=50, figsize=(20,15))
Out[61]:
- 이산형 변수 EDA
In [62]:
cate_data = data[cate_cols]
cate_data.columns
Out[62]:
In [181]:
cate_data[cate_cols[2]].value_counts().plot(kind = "bar")
Out[181]:
모델 만들기
- 1) 일부 컬럼만 선택함(회귀모델이니 연속형 변수만)
- 2) 데이터 결측값 처리함
- 3) 모델에 쓸 변수만 다시 선택함
- 4) 트레이닝/테스트셋 분리
- 5) 모델 학습
- 6) 모델 검증
1)일부컬럼 선택(연속형만)
In [106]:
num_data = data._get_numeric_data()
num_data.head()
Out[106]:
2) 결측값 처리
In [107]:
def cnt_NA(df):
colname = df.columns.tolist()
for i in colname:
if sum(pd.isnull(df[i])) != 0:
na = sum(pd.isnull(df[i]))
print(i + ":" + str(na)+ ", NA_ratio:" + str(na/len(df)))
print("NA test end")
In [79]:
cnt_NA(num_data)
- 결측값 제거
In [110]:
num_data = num_data.dropna(axis=0, how='any')
cnt_NA(num_data)
3) 모델에 쓸 데이터만 선택
- 그냥 연속형 변수만 다쓰겠음 : num_data
4) 트레이닝 테스트셋 분리
- 싸이킷런에서 지원해주는 함수 사용
- from sklearn.model_selection import train_test_split
In [133]:
from sklearn.model_selection import train_test_split
train, test = train_test_split(num_data, test_size=0.2)
print(len(train), len(test))
In [134]:
test.head()
Out[134]:
In [135]:
train_x = train.iloc[:,:-1]
train_y = train.iloc[:, -1]
In [136]:
train_x.head()
Out[136]:
In [138]:
train_y.head()
Out[138]:
리그레션 트레이닝
In [158]:
train_x = np.asarray(train_x)
train_y = np.asarray(train_y)
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_x, train_y)
Out[158]:
In [159]:
lr.coef_
Out[159]:
In [160]:
lr.intercept_
Out[160]:
테스트
In [161]:
test_x = test.iloc[:,:-1]
test_y = test.iloc[:, -1]
In [162]:
y_pred = lr.predict(test_x)
In [163]:
from sklearn.metrics import mean_squared_error
mean_squared_error(test_y, y_pred)
Out[163]:
릿지 리그레션
In [164]:
from sklearn.linear_model import Ridge
clf = Ridge(alpha=1.0)
clf.fit(train_x, train_y)
Out[164]:
In [167]:
y_pred = clf.predict(test_x)
In [174]:
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(test_y, y_pred)
mse
Out[174]:
In [175]:
np.sqrt(mse)
Out[175]: