wisdiom 아니고 wisdom

4. 머신러닝 데이터 분석(1) 본문

👩‍💻/pandas

4. 머신러닝 데이터 분석(1)

글로랴 2021. 2. 5. 00:26

1️⃣ Regression, 회귀분석

가격, 매출, 주가, 환율, 수량 등 연속적인 값을 갖는 연속 변수를 예측하는데 주로 활용된다.

 

회귀분석은 하나의 변수가 나머지 다른 변수들 간의 선형적 관계를 갖는가의 여부를 분석하는 방법으로 하나의 종속변수(예측하고자 하는 값)와 독립변수(예측을 위해 모형이 사용하는 속성) 사이의 관계를 명시하는 것을 말한다.

 

 

🧨 Simple Linear Regression, 단순회귀분석 (선형 회귀선)

두 변수 간의 관계를 직선 형태로 설명하는 알고리즘

 

수학적으로 종속 변수 Y와 독립 변수 X 사이의 관계를 1차함수 Y=aX+b로 나타낸다. 단순회귀분석 알고리즘은 훈련 데이터를 이용하여 직선의 기울기(a)와 직선이 y축과 교차하는 지점인 y절편(b)을 반복 학습을 통해 찾는다. 즉, 변수 X와 Y에 대한 정보를 가지고, 일차 방정식의 계수 a, b를 찾는 과정이다.

 

● (1) 데이터 준비

### 기본 라이브러리 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

'''
[Step 1] 데이터 준비 - read_csv() 함수로 자동차 연비 데이터셋 가져오기
'''
# CSV 파일을 데이터프레임으로 변환
df = pd.read_csv('./auto-mpg.csv', header=None)

# 열 이름 지정
df.columns = ['mpg','cylinders','displacement','horsepower','weight',
              'acceleration','model year','origin','name'] 

# 데이터 살펴보기
df.head()

 

● (2) 데이터 탐색

df.info()
df.describe()

df['horsepower'].unique()

df.horsepower.replace('?', np.nan, inplace=True)         # '?'를 np.nan으로 변경
df.dropna(subset=['horsepower'], axis=0, inplace=True)   # 누락 데이터 행 삭제
df.horsepower = df.horsepower.astype('float')             # 문자열을 실수형으로 변환

df.describe()

 

● (3) 속성 선택

# 분석에 활용할 열(속성) 선택
ndf = df[ ['mpg', 'cylinders', 'horsepower', 'weight'] ]

## 두 변수 간의 모든 경우의 수 그리기
sns.pairplot(ndf)

plt.show()

 

 

● (4) train / test 데이터 분할

산점도를 통해 'mpg'열과 선형관계를 보이는 'horsepower'열과 'weight'열을 독립변수 X로 선택하는 것을 고려한다.

### 독립변수 : weight
x = ndf[['weight']]
y = ndf['mpg']

# train data와 test data로 구분 (7:3 비율)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,                 # 독립변수 
                                                    y,                 # 종속변수
                                                    test_size=0.3,     # 검증 30%
                                                    random_state=10)   # 랜덤 추출 값

print('train data:', len(x_train))	# 274
print('test data:', len(x_test))	# 118

 

● (5) 모형 학습 및 검증

#sklearn 라이브러리에서 선형회귀분석 모듈 가져오기
from sklearn.linear_model import LinearRegression

# 단순회귀분석 모형 객체 생성
lr = LinearRegression()

# train data로 모형 학습
lr.fit(x_train, y_train)

# 학습을 마친 모형에 test data를 적용해 결정계수(R-Square) 계산
# 결정계수 값이 클수록 모형의 예측 능력이 좋다고 판단한다.
r_square = lr.score(x_test, y_test)
print('R-Square: ', r_square)	# R-Square:  0.6822458558299325

# 회귀식의 기울기
print('a: ', lr.coef_)	# a:  [-0.00775343]

# 회귀식의 y절편
print('b: ', lr.intercept_)	# b:  46.7103662572801

💡 실행결과

'회귀선의 관계식 : Y = aX + b'

회귀방정식을 구성하는 계수 a, b를 확인할 수 있다.

계수 a는 회귀식의 기울기를 나타내고, 모형 객체 lr의 coef_ 속성값이다.
계수 b는 y절편이고, 모형 객체 lr의 intercept_ 속성값이다.

 

# 모형이 예측한 결과와 실제 값 비교
y_hat = lr.predict(x)

plt.figure(figsize=(10, 5))
ax1 = sns.distplot(y, hist=False, label='y')
ax2 = sns.distplot(y_hat, hist=False, label='y_hat', ax=ax1)
plt.show()

💡 실행결과

실제 값은 왼쪽으로 편향되어 있고 예측값은 반대로 오른쪽으로 편중되는 경향을 보인다.
따라서 독립변수(weight)와 종속변수(mpg) 사이에 선형관계가 있지만, 모형의 오차를 더 줄일 필요가 있다.

앞에서 그린 산점도를 보면 직선보다는 곡선의 형태가 더 적합해 보이므로 비선형 회귀분석을 통해 모형의 정확도를 높일 수 있다.

 

 

 

 

 

🧨 Polynomial Regression, 다항회귀분석 (비선형 회귀선)

2차함수 이상의 다항 함수를 이용하여 두 변수 간의 선형관계를 설명하는 알고리즘

독립변수 X와 종속변수 Y 사이에 선형 상관관계가 있지만 직선보다는 곡선으로 설명하는 것이 적합할 때 사용

 

● (5) 모형 학습 및 검증

from sklearn.linear_model import LinearRegression      # 선형회귀분석
from sklearn.preprocessing import PolynomialFeatures   # 다항식 변환

poly = PolynomialFeatures(degree=2)     # 2차항 적용
x_train_poly = poly.fit_transform(x_train)   # x_train 데이터를 2차항으로 변경

print('2 dgree train data: ', x_train_poly.shape)	# (274, 3)
# train data로 모형 학습
pr = LinearRegression()
pr.fit(x_train_poly, y_train)

# 학습을 마친 모형에 test data 적용 및 결정계수 계산
x_test_poly = poly.fit_transform(x_test)
r_square = pr.score(x_test_poly, y_test)

print(r_square)	# 0.7087009262975481
# train data로 모형 학습
pr = LinearRegression()
pr.fit(x_train_poly, y_train)

# 학습을 마친 모형에 test data 적용 및 결정계수 계산
x_test_poly = poly.fit_transform(x_test)
r_square = pr.score(x_test_poly, y_test)

print(r_square)

# 모형이 예측한 결과와 실제 값 비교하기
## 모형에 전체 x 데이터를 입력하여 예측한 값 y_hat을 실제 값 y와 비교
x_poly = poly.fit_transform(x)
y_hat = pr.predict(x_poly)

plt.figure(figsize=(10, 5))
ax1 = sns.distplot(y, hist=False, label='y')
ax2 = sns.distplot(y_hat, hist=False, label='y_hat', ax=ax1)

plt.show()

💡 실행결과

단순회귀 분석의 결과와 비교했을 때, 데이터가 어느 한쪽으로 편향되는 경향이 감소한 것을 알 수 있다.
따라서 더 적합한 모형이라고 볼 수 있다.

 

 

 

🧨 Multivariate Regression, 다중회귀분석

여러 개의 독립변수가 종속변수에 영향을 주고 선형 관계를 갖는 경우 사용하는 알고리즘

수학적으로 종속변수 Y와 독립변수 Xn 간의 관계를 Y = b + a1X1 + a2X2 + ... + anXn와 같은 함수식으로 표현한다.
각 독립변수의 계수와 상수항에 적절한 값들을 찾아가는 과정이다.

 

● (4) 훈련 / 검증 데이터 분할

x = ndf[['cylinders', 'horsepower', 'weight']]
y = ndf['mpg']

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=10)

print('train data: ', x_train.shape)	# (274, 3)
print('test data: ', x_test.shape)		# (118, 3)

 

● (5) 모형 학습 및 검증

from sklearn.linear_model import LinearRegression

lr = LinearRegression()

lr.fit(x_train, y_train)

r_square = lr.score(x_test, y_test)

print('R-Square: ', r_square)	# R-Square:  0.6939048496695599
print('a: ', lr.coef_)			# a:  [-0.60691288 -0.03714088 -0.00522268]
print('b: ', lr.intercept_)		# b:  46.414351269634025
y_hat = lr.predict(x_test)

plt.figure(figsize=(10, 5))
ax1 = sns.distplot(y_test, hist=False, label='y')
ax2 = sns.distplot(y_hat, hist=False, label='y_hat', ax=ax1)
plt.show()

 

 

 

반응형

'👩‍💻 > pandas' 카테고리의 다른 글

4. 머신러닝 데이터 분석(2) - 2  (0) 2021.02.15
4. 머신러닝 데이터 분석(2) - 1  (0) 2021.02.15
4. 머신러닝 데이터 분석(0)  (0) 2021.02.04
3. 데이터프레임 응용(6)  (0) 2021.02.02
3. 데이터프레임 응용(5)  (0) 2021.02.01
Comments