🔍 회귀(Regression) 분석과 실제 서비스화 🌟
🔹Regression 란?
회귀는 결과값(타겟)이 연속적인 수치로 표현되는 문제를 해결하기 위한 머신러닝 방법입니다.
예를 들어, 직원의 경력을 바탕으로 연봉을 예측하거나 주택의 크기로 가격을 예측하는 문제가 이에 해당합니다.
머신러닝을 활용하여 경력이 주어졌을때 연봉을 예측하는 모델을 만드는 방법을 단계별로 설명해 보겠습니다.
🛠️ 데이터 처리 단계
데이터를 회귀 모델에 활용하기 위해 아래와 같은 전처리 과정이 필요합니다.
📌 NaN비어있는 데이터 확인
데이터셋에서 결측값(Missing Values)이 있는지 확인하고, 이를 처리해야 합니다.
- isna() 함수로 결측값을 확인합니다.
- 결측값이 많다면 특정 값으로 대체하거나 제거해야 합니다.
📌 데이터 분리 (X와 Y)
데이터를 **입력(X)**과 **결과(Y)**로 분리합니다.
#2. X와 Y로 데이터 분리
y=df['Salary']
x=df['YearsExperience']
#x는 일차원이면 안된다!!
#to_frame()
X=df['YearsExperience'].to_frame()
❗ 중요: X는 반드시 다차원 배열이어야 합니다. 일차원인 경우 .to_frame() 메서드로 변환하세요.
📌 문자열 데이터를 숫자로 변환
모델은 숫자 데이터를 이해하므로, 문자열로 되어 있는 데이터는 레이블 인코딩(Label Encoding)이나 원-핫 인코딩(One-Hot Encoding)을 활용해 숫자로 변환합니다.
📌 피처 스케일링 (Feature Scaling)
데이터의 범위를 조정해 모델 학습을 돕습니다.
- 표준화(Standardization): 평균을 0, 분산을 1로 조정
- 정규화(Normalization): 데이터 값을 0~1 사이로 조정
우리가 만들려하는 리니어 리그레션(Linear Regression)은 자체적으로 피쳐스케일링을 합니다.
🤖 모델 학습: 회귀 분석
회귀 모델(예: 선형 회귀)을 사용해 데이터를 학습합니다. 학습 과정은 다음과 같습니다:
- 모델 생성: LinearRegression, Random Forest, XGBoost 등 모델 선택
- 모델 학습: fit() 메서드로 데이터를 모델에 맞춤
- 예측: 새로운 데이터를 사용해 결과를 예측
LinearRegression
#train용, test용으로 데이터를 나눈다.
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=24)
#regressor에게 학습시킴 데이터에 피팅하라
regressor=LinearRegression()
regressor.fit(X_train,y_train)
#트레이닝을 토대로 테스트 진행
y_pred=regressor.predict(X_test)
RandomForest
# RandomForestRegressor 사용
from sklearn.ensemble import RandomForestRegressor
regressor2=RandomForestRegressor(random_state=27)
#n_estimators= 모델이 생성하는 개별 트리의 개수 100~500사이의 숫자를 넣어준다. 디폴트값 100, 난수설정 27
Xgboost
from xgboost import XGBRegressor
regressor3=XGBRegressor(random_state=27, n_estimators=500, learning_rate=0.05)
#learning_rate=0.1 < 학습속도 조절 0.01 ~ 0.1 사이의 값
#숫자가 작을 수록 더 많은 반복
📊 회귀 문제의 성능 평가
오차(Error)와 그 처리 방법
모델의 성능을 평가하기 위해 오차(error)를 계산합니다. 오차는 실제값과 예측값의 차이입니다. 이상적으로는 오차가 0에 가까워야 합니다.
문제점
- 오차에는 양수와 음수가 포함될 수 있습니다. 예를 들어:
- 1: -100
- 2: 100
- 3: 200
- 4: -200
이 경우 오차의 합은 0이 되지만, 실제로는 오차가 존재합니다.
해결 방법: 제곱 오차 사용
- MSE (Mean Squared Error): 오차의 제곱을 모두 더한 뒤 평균을 구합니다. 이렇게 하면 음수 오차가 양수로 변환되어 문제가 해결됩니다.MSE=1n∑i=1n(ytest−ypred)2MSE = \frac{1}{n} \sum_{i=1}^{n} (y_{test} - y_{pred})^2
- RMSE (Root Mean Squared Error): MSE의 값이 너무 커지는 문제를 완화하기 위해 루트를 적용합니다.RMSE=MSERMSE = \sqrt{MSE}
예제 코드:
# MSE 계산
mse = ((Y_test - predictions)**2).mean()
print(f"Mean Squared Error: {mse}")
# RMSE 계산
rmse = np.sqrt(mse)
print(f"Root Mean Squared Error: {rmse}")
회귀 모델의 성능은 다음 지표로 평가합니다:
- R² (결정 계수): 모델이 데이터를 얼마나 잘 설명하는지 평가
- MSE (평균 제곱 오차): 예측값과 실제값 간의 차이를 제곱하여 평균낸 값
- MAE (평균 절대 오차): 예측값과 실제값 간의 차이의 절대값 평균
검증 라이브러리를 사용한 성능평가
#성능평가의 다른 방법 - 검증 라이브러리사용
from sklearn.metrics import mean_squared_error, r2_score,mean_absolute_error
mean_squared_error(y_test, y_pred) #MSE
mean_absolute_error(y_test, y_pred) #MAE,절대값 붙여계산
r2_score(y_test,y_pred) #0,1사이로 나옴 1에 가까울수록 좋은 모델
🌐 실제 서비스화
경력 28년, 15년, 32년 입력시 연봉을 예측해봅니다.
new_data1=np.array([28,15,31]).reshape(3,1)
#회귀 모델에서 입력 데이터 X는 2차원 배열 형태여야 합니다.
# np.array([28]).reshape(1,1).shape #2차원 1행 1열
# np.array([28,15,31]).reshape(3,1) #2차원 3행 1열
regressor.predict(new_data1)
출력값 :
array([294371.5885685 , 169106.60572978, 323278.89230052])
서비스화 시 고려사항
- 데이터 정규 업데이트: 서비스 데이터는 시간이 지나면 변화할 수 있으므로 주기적으로 모델을 재학습해야 합니다.
- 배포 환경 설정: API 또는 클라우드 서비스를 통해 모델 배포
- 성능 최적화: 실시간 예측을 위해 모델 경량화 또는 캐싱 활용
서비스에서 활용하면, 사용자 경험을 개선하고 실질적인 비즈니스 가치를 창출할 수 있습니다. 🚀
📊 예측결과 확인
예측 결과를 이해하기 쉽게 차트로 확인해보겠습니다.
df_y=y_test.to_frame()
#예측값을 새 컬럼으로 붙여주자.
df_y['y_pred']=y_pred
#기존인덱스는 버리자.
df_y.reset_index(drop=True, inplace=True)
df_y.plot(kind='bar')
plt.show()
🤔 머신러닝 vs 딥러닝: 차이점
머신러닝
- 데이터가 상대적으로 적어도 작동 가능
- 단순하고 빠르게 구현 가능
- 예: 선형 회귀, 결정 트리, 랜덤 포레스트
딥러닝
- 방대한 데이터와 강력한 계산 자원이 필요
- 신경망 구조를 활용하여 복잡한 문제 해결 가능
- 예: 딥러닝 기반 이미지 분류, 자연어 처리
이와 같은 단계를 통해 회귀 모델을 효과적으로 활용하고 서비스에 접목할 수 있습니다! 😊
Multiple Linear Regression (다중 선형 회귀)
다중 선형 회귀(Multiple Linear Regression)는 선형 회귀(Linear Regression)의 확장된 형태로, 하나 이상의 독립 변수(입력 변수)와 하나의 종속 변수(목표 변수) 간의 관계를 모델링하는 방법입니다.
Ex) 회사의 R&D, 마케팅, 관리비용이 매출에 미치는 영향을 분석한다고 가정