개발 환경 정리
운영체제: Windows OS
프로그래밍 언어: Python
개발 툴: Jupyter Lab
데이터 시각화: matplotlib, seaborn
데이터 처리: pandas, numpy
머신러닝 프레임워크: scikit-learn
자료
보스턴 하우스 데이터: 이 데이터셋은 StatLib 라이브러리에서 가져온 것이며 카네기 멜론 대학교에서 관리하고 있다.
이 데이터셋은 보스턴 시의 주택 가격에 관한 것이다. 제공된 데이터셋에는 13개의 특성을 가진 506개의 인스턴스가 있다.
데이터셋의 설명은 아래 표와 같다.
**참고:
원래는 보스턴 데이터는 사이킷런 모듈에서 아래처럼 임포트가 가능했으나, 윤리적 문제 때문에 삭제되었다.
from sklearn.datasets import load_boston
boston = load_boston()
자세한 내용은 접은글 참조 ↓
load_boston은 scikit-learn 버전 1.2부터 제거되었습니다.
보스턴 주택 가격 데이터셋에는 윤리적 문제가 있습니다.
[1]에서 조사한 바에 따르면, 이 데이터셋의 작성자들은 인종의 자기 분리가 주택 가격에 긍정적인 영향을 미친다고 가정하고 비가역적인 변수 "B"를 설계하였습니다
[2]. 또한 이 데이터셋을 생성하게 된 연구의 목적은 대기 품질의 영향을 연구하는 것이었지만, 이러한 가정의 타당성에 대한 적절한 증명을 제시하지 않았습니다.
따라서 scikit-learn의 유지 관리자들은 데이터 과학과 머신러닝에서의 윤리적 문제에 대해 연구하고 교육하는 목적이 아닌 이상 이 데이터셋의 사용을 강력히 권장하지 않습니다.
이 특별한 경우에는 원래의 출처에서 데이터셋을 가져올 수 있습니다:
import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
대체할 수 있는 데이터셋으로는 캘리포니아 주택 데이터셋과 Ames 주택 데이터셋이 있다.
다음과 같이 데이터셋을 불러올 수 있습니다:
캘리포니아 집값 데이터
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
Ames 주택 데이터셋
from sklearn.datasets import fetch_openml
housing = fetch_openml(name="house_prices", as_frame=True)
선형 회귀 모델을 만들어, 집값을 예측해 보자.
모듈/라이브러리 import
# 라이브러리 import
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# matplotlib 글씨체 변경
plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False
# 데이터 불러오기
data = pd.read_csv('../data/boston_house/house_price.csv')
데이터 타입 확인
# 데이터 쉐입
data.shape
(506, 15)
# 데이터 컬럼 확인
data.columns
Index(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX',
'PTRATIO', 'B', 'LSTAT', 'MEDV', 'CAT.MEDV'],
dtype='object')
# 데이터 상위 항목 확인
data.head(10)
CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | MEDV | CAT.MEDV | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00632 | 18.0 | 2.31 | 0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1 | 296 | 15.3 | 396.90 | 4.98 | 24.0 | 0 |
1 | 0.02731 | 0.0 | 7.07 | 0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2 | 242 | 17.8 | 396.90 | 9.14 | 21.6 | 0 |
2 | 0.02729 | 0.0 | 7.07 | 0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2 | 242 | 17.8 | 392.83 | 4.03 | 34.7 | 1 |
3 | 0.03237 | 0.0 | 2.18 | 0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3 | 222 | 18.7 | 394.63 | 2.94 | 33.4 | 1 |
4 | 0.06905 | 0.0 | 2.18 | 0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3 | 222 | 18.7 | 396.90 | 5.33 | 36.2 | 1 |
5 | 0.02985 | 0.0 | 2.18 | 0 | 0.458 | 6.430 | 58.7 | 6.0622 | 3 | 222 | 18.7 | 394.12 | 5.21 | 28.7 | 0 |
6 | 0.08829 | 12.5 | 7.87 | 0 | 0.524 | 6.012 | 66.6 | 5.5605 | 5 | 311 | 15.2 | 395.60 | 12.43 | 22.9 | 0 |
7 | 0.14455 | 12.5 | 7.87 | 0 | 0.524 | 6.172 | 96.1 | 5.9505 | 5 | 311 | 15.2 | 396.90 | 19.15 | 27.1 | 0 |
8 | 0.21124 | 12.5 | 7.87 | 0 | 0.524 | 5.631 | 100.0 | 6.0821 | 5 | 311 | 15.2 | 386.63 | 29.93 | 16.5 | 0 |
9 | 0.17004 | 12.5 | 7.87 | 0 | 0.524 | 6.004 | 85.9 | 6.5921 | 5 | 311 | 15.2 | 386.71 | 17.10 | 18.9 | 0 |
data.describe()
CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | MEDV | CAT.MEDV | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 | 506.000000 |
mean | 3.613524 | 11.363636 | 11.136779 | 0.069170 | 0.554695 | 6.284634 | 68.574901 | 3.795043 | 9.549407 | 408.237154 | 18.455534 | 356.674032 | 12.653063 | 22.532806 | 0.166008 |
std | 8.601545 | 23.322453 | 6.860353 | 0.253994 | 0.115878 | 0.702617 | 28.148861 | 2.105710 | 8.707259 | 168.537116 | 2.164946 | 91.294864 | 7.141062 | 9.197104 | 0.372456 |
min | 0.006320 | 0.000000 | 0.460000 | 0.000000 | 0.385000 | 3.561000 | 2.900000 | 1.129600 | 1.000000 | 187.000000 | 12.600000 | 0.320000 | 1.730000 | 5.000000 | 0.000000 |
25% | 0.082045 | 0.000000 | 5.190000 | 0.000000 | 0.449000 | 5.885500 | 45.025000 | 2.100175 | 4.000000 | 279.000000 | 17.400000 | 375.377500 | 6.950000 | 17.025000 | 0.000000 |
50% | 0.256510 | 0.000000 | 9.690000 | 0.000000 | 0.538000 | 6.208500 | 77.500000 | 3.207450 | 5.000000 | 330.000000 | 19.050000 | 391.440000 | 11.360000 | 21.200000 | 0.000000 |
75% | 3.677083 | 12.500000 | 18.100000 | 0.000000 | 0.624000 | 6.623500 | 94.075000 | 5.188425 | 24.000000 | 666.000000 | 20.200000 | 396.225000 | 16.955000 | 25.000000 | 0.000000 |
max | 88.976200 | 100.000000 | 27.740000 | 1.000000 | 0.871000 | 8.780000 | 100.000000 | 12.126500 | 24.000000 | 711.000000 | 22.000000 | 396.900000 | 37.970000 | 50.000000 | 1.000000 |
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 CRIM 506 non-null float64
1 ZN 506 non-null float64
2 INDUS 506 non-null float64
3 CHAS 506 non-null int64
4 NOX 506 non-null float64
5 RM 506 non-null float64
6 AGE 506 non-null float64
7 DIS 506 non-null float64
8 RAD 506 non-null int64
9 TAX 506 non-null int64
10 PTRATIO 506 non-null float64
11 B 506 non-null float64
12 LSTAT 506 non-null float64
13 MEDV 506 non-null float64
14 CAT.MEDV 506 non-null int64
dtypes: float64(11), int64(4)
memory usage: 59.4 KB
학습 데이터 분리
# 학습 데이터 분리
x = data.drop(['MEDV'], axis = 1)
y = data['MEDV']
# from sklearn.cross_validation import train_test_split
# 서브모듈 cross_validation은 model_selection으로 이름이 변경되었고, 사용이 권장되지 않는다.
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size = 0.2, random_state = 0)
print('xtrain 쉐입: ', xtrain.shape)
print('xtest 쉐입: ', xtest.shape)
print('ytrain 쉐입: ', ytrain.shape)
print('ytest 쉐입: ', ytest.shape)
xtrain 쉐입: (404, 14)
xtest 쉐입: (102, 14)
ytrain 쉐입: (404,)
ytest 쉐입: (102,)
다중 선형 회귀 모델 적용
# 훈련 모델에 다중 선형 회귀 모델을 적용시키기
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(xtrain, ytrain)
# 테스트 결과 예측
y_pred = regressor.predict(xtest)
# 예측 결과를 보여주기 위한 산점도 그리기
# 'ytrue' 값 대 'y_pred' 값
plt.scatter(ytest, y_pred, c='green')
plt.xlabel("가격: 천 달러 단위($1000)")
plt.ylabel("예측된 값")
plt.title("실제 값 vs 예측 값 : 선형 회귀")
plt.show()
# 선형 회귀의 결과, 즉 평균 제곱 오차와 평균 절대 오차
'''
여기서 평균 제곱 오차는 모델의 예측값과 실제 값의 차이를 제곱하여 평균한 값이며,
평균 절대 오차는 모델의 예측값과 실제 값의 차이의 절대값을 평균한 값입니다.
'''
from sklearn.metrics import mean_squared_error, mean_absolute_error
MSE = mean_squared_error(ytest, y_pred)
MAE = mean_absolute_error(ytest, y_pred)
print("평균 제곱 오차: ", MSE)
print("평균 절대 오차: ", MAE)
print("정확도: ", 100-MSE)
평균 제곱 오차: 19.180878582086102
평균 절대 오차: 3.0179430424269142
정확도: 80.81912141791389
errors = ytest - y_pred
plt.hist(errors, bins=50, color='pink')
plt.xlabel("오차")
plt.ylabel("빈도")
plt.title("예측 오차의 히스토그램")
plt.show()
residuals = ytest - y_pred
plt.scatter(y_pred, residuals, c='lightgreen')
plt.xlabel("예측된 값")
plt.ylabel("잔차")
plt.title("잔차 그래프")
plt.axhline(y=0, color='black', linestyle='--')
plt.show()
'개발공부 > 머신러닝,딥러닝' 카테고리의 다른 글
mediapipe 사용하여 팔굽히기 모션 인식하기 (0) | 2023.09.08 |
---|---|
CNN keras 모듈 사용하여 졸음 방지 모델 생성하기 (0) | 2023.09.05 |
[Python] 로지스틱 회귀(LogisticRegression) 이용하여 붓꽃 데이터 분석 (0) | 2023.08.18 |
[Python] sklearn 모듈 KNeighborsClassifier 알고리즘으로 도미, 빙어 구분하기 (0) | 2023.08.16 |