기계상태 예측 인공지능 끄적여보기
AI Predictive Maintenance for Machines
기계를 위한 AI 예측 유지보수
Introduction
인공지능은 프로세스를 자동화하고, 비즈니스에 대한 통찰력을 모으고, 프로세스 속도를 높이기 위해 다양한 산업에서 사용되고 있습니다. 인공지능이 실제로 산업에 어떤 영향을 미치는지 실제 시나리오에서 인공지능의 사용을 연구하기 위해 Python을 사용할 것입니다.- AI가 항공기의 센서 데이터를 사용하여 유지 관리가 필요한 센서를 예측하는 방법을 연구합니다.
Context
우리는 Github에서 얻은 항공기 센서 데이터를 사용합니다. csv 파일에는 Microsoft에서 제공하는 시뮬레이션된 항공기 엔진 고장 이벤트, 작동 설정 및 21개 센서 측정값이 포함되어 있습니다. 엔진의 성능 저하 패턴이 센서 측정에 반영된다고 가정합니다.
Use Python to open csv files
scikit-learn, pandas, matplotlib를 사용하여 데이터 세트를 작업합니다. Scikit-learn은 예측 데이터 분석을 위한 효율적인 도구를 제공하는 매우 유용한 기계 학습 라이브러리입니다. Pandas는 데이터 과학을 위한 인기 있는 Python 라이브러리입니다. 강력하고 유연한 데이터 구조를 제공하여 데이터 조작 및 분석을 더 쉽게 만듭니다. Matplotlib은 고품질의 데이터 시각화를 위한 Python의 2차원 그래프 라이브러리입니다. 코드 몇 줄만으로 간단하게 복잡한 그래프를 만들 수 있어서 사용성이 매우 높습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline
from sklearn import linear_model
from sklearn.ensemble import RandomForestRegressor
from sklearn import model_selection
from sklearn.tree import DecisionTreeRegressor, DecisionTreeClassifier, export_graphviz
from sklearn import metrics
from sklearn.feature_selection import SelectFromModel, RFECV
Data 설명
# Train 데이터 불러오기
df_train = pd.read_csv(r'[Dataset]_Module11_Train_(Maintenance).csv')
데이터 세트에는 시뮬레이션된 시뮬레이션된 항공기 엔진 고장 이벤트, 작동 설정 및 21개 센서 측정값이 포함되어 있습니다. 이제 그 Data를 실제로 보도록 하겠습니다.
Task1: 첫 10개 행을 출력하여 train 데이터 탐색하기
# your cod ehere
df_train.head(10)
| id | cycle | setting1 | setting2 | setting3 | s1 | s2 | s3 | s4 | s5 | ... | sd15 | sd16 | sd17 | sd18 | sd19 | sd20 | sd21 | ttf | label_bnc | label_mcc | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | -0.0007 | -0.0004 | 100.0 | 518.67 | 641.82 | 1589.70 | 1400.60 | 14.62 | ... | 0.000000 | 0.0 | 0.000000 | 0.0 | 0.0 | 0.000000 | 0.000000 | 191 | 0 | 0 |
| 1 | 1 | 2 | 0.0019 | -0.0003 | 100.0 | 518.67 | 642.15 | 1591.82 | 1403.14 | 14.62 | ... | 0.008697 | 0.0 | 0.000000 | 0.0 | 0.0 | 0.042426 | 0.003253 | 190 | 0 | 0 |
| 2 | 1 | 3 | -0.0043 | 0.0003 | 100.0 | 518.67 | 642.35 | 1587.99 | 1404.20 | 14.62 | ... | 0.007640 | 0.0 | 1.154701 | 0.0 | 0.0 | 0.055076 | 0.044573 | 189 | 0 | 0 |
| 3 | 1 | 4 | 0.0007 | 0.0000 | 100.0 | 518.67 | 642.35 | 1582.79 | 1401.87 | 14.62 | ... | 0.028117 | 0.0 | 1.000000 | 0.0 | 0.0 | 0.076322 | 0.037977 | 188 | 0 | 0 |
| 4 | 1 | 5 | -0.0019 | -0.0002 | 100.0 | 518.67 | 642.37 | 1582.85 | 1406.22 | 14.62 | ... | 0.025953 | 0.0 | 1.095445 | 0.0 | 0.0 | 0.073621 | 0.033498 | 187 | 0 | 0 |
| 5 | 1 | 6 | -0.0043 | -0.0001 | 100.0 | 518.67 | 642.10 | 1584.47 | 1398.37 | 14.62 | ... | 0.025727 | 0.0 | 1.140175 | 0.0 | 0.0 | 0.051186 | 0.031436 | 186 | 0 | 0 |
| 6 | 1 | 7 | 0.0010 | 0.0001 | 100.0 | 518.67 | 642.48 | 1592.32 | 1397.77 | 14.62 | ... | 0.023476 | 0.0 | 1.140175 | 0.0 | 0.0 | 0.086718 | 0.021634 | 185 | 0 | 0 |
| 7 | 1 | 8 | -0.0034 | 0.0003 | 100.0 | 518.67 | 642.56 | 1582.96 | 1400.97 | 14.62 | ... | 0.022477 | 0.0 | 0.836660 | 0.0 | 0.0 | 0.086487 | 0.034405 | 184 | 0 | 0 |
| 8 | 1 | 9 | 0.0008 | 0.0001 | 100.0 | 518.67 | 642.12 | 1590.98 | 1394.80 | 14.62 | ... | 0.020740 | 0.0 | 0.836660 | 0.0 | 0.0 | 0.077136 | 0.038939 | 183 | 0 | 0 |
| 9 | 1 | 10 | -0.0033 | 0.0001 | 100.0 | 518.67 | 641.71 | 1591.24 | 1400.46 | 14.62 | ... | 0.020493 | 0.0 | 0.836660 | 0.0 | 0.0 | 0.062849 | 0.058103 | 182 | 0 | 0 |
10 rows × 71 columns
# test 데이터 불러오기 여기서 target(y_test)는 ttf.
df_test = pd.read_csv(r'[Dataset]_Module11_Test_(Maintenance).csv')
df_test.head()
| id | cycle | setting1 | setting2 | setting3 | s1 | s2 | s3 | s4 | s5 | ... | sd15 | sd16 | sd17 | sd18 | sd19 | sd20 | sd21 | ttf | label_bnc | label_mcc | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 31 | -0.0006 | 0.0004 | 100.0 | 518.67 | 642.58 | 1581.22 | 1398.91 | 14.62 | ... | 0.021174 | 0.0 | 0.707107 | 0.0 | 0.0 | 0.124016 | 0.025037 | 112 | 0 | 0 |
| 1 | 2 | 49 | 0.0018 | -0.0001 | 100.0 | 518.67 | 642.55 | 1586.59 | 1410.83 | 14.62 | ... | 0.011429 | 0.0 | 1.095445 | 0.0 | 0.0 | 0.069785 | 0.027820 | 98 | 0 | 0 |
| 2 | 3 | 126 | -0.0016 | 0.0004 | 100.0 | 518.67 | 642.88 | 1589.75 | 1418.89 | 14.62 | ... | 0.030924 | 0.0 | 0.836660 | 0.0 | 0.0 | 0.143631 | 0.018966 | 69 | 0 | 0 |
| 3 | 4 | 106 | 0.0012 | 0.0004 | 100.0 | 518.67 | 642.78 | 1594.53 | 1406.88 | 14.62 | ... | 0.021249 | 0.0 | 1.341641 | 0.0 | 0.0 | 0.126372 | 0.021106 | 82 | 0 | 0 |
| 4 | 5 | 98 | -0.0013 | -0.0004 | 100.0 | 518.67 | 642.27 | 1589.94 | 1419.36 | 14.62 | ... | 0.009627 | 0.0 | 0.547723 | 0.0 | 0.0 | 0.091924 | 0.101100 | 91 | 0 | 0 |
5 rows × 71 columns
Task 2: describe 함수를 사용하여 train과 test data set 에 대한 정보 가져오기
# your code here
df_train.describe()
| id | cycle | setting1 | setting2 | setting3 | s1 | s2 | s3 | s4 | s5 | ... | sd15 | sd16 | sd17 | sd18 | sd19 | sd20 | sd21 | ttf | label_bnc | label_mcc | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 20631.000000 | 20631.000000 | 20631.000000 | 20631.000000 | 20631.0 | 2.063100e+04 | 20631.000000 | 20631.000000 | 20631.000000 | 2.063100e+04 | ... | 20631.000000 | 20631.0 | 20631.000000 | 20631.0 | 20631.0 | 20631.000000 | 20631.000000 | 20631.000000 | 20631.000000 | 20631.000000 |
| mean | 51.506568 | 108.807862 | -0.000009 | 0.000002 | 100.0 | 5.186700e+02 | 642.680934 | 1590.523119 | 1408.933782 | 1.462000e+01 | ... | 0.018802 | 0.0 | 0.885173 | 0.0 | 0.0 | 0.094636 | 0.056483 | 107.807862 | 0.150259 | 0.227813 |
| std | 29.227633 | 68.880990 | 0.002187 | 0.000293 | 0.0 | 6.537152e-11 | 0.500053 | 6.131150 | 9.000605 | 3.394700e-12 | ... | 0.007103 | 0.0 | 0.341989 | 0.0 | 0.0 | 0.034867 | 0.020669 | 68.880990 | 0.357334 | 0.575358 |
| min | 1.000000 | 1.000000 | -0.008700 | -0.000600 | 100.0 | 5.186700e+02 | 641.210000 | 1571.040000 | 1382.250000 | 1.462000e+01 | ... | 0.000000 | 0.0 | 0.000000 | 0.0 | 0.0 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 25% | 26.000000 | 52.000000 | -0.001500 | -0.000200 | 100.0 | 5.186700e+02 | 642.325000 | 1586.260000 | 1402.360000 | 1.462000e+01 | ... | 0.013724 | 0.0 | 0.547723 | 0.0 | 0.0 | 0.070071 | 0.041825 | 51.000000 | 0.000000 | 0.000000 |
| 50% | 52.000000 | 104.000000 | 0.000000 | 0.000000 | 100.0 | 5.186700e+02 | 642.640000 | 1590.100000 | 1408.040000 | 1.462000e+01 | ... | 0.018365 | 0.0 | 0.836660 | 0.0 | 0.0 | 0.092736 | 0.055555 | 103.000000 | 0.000000 | 0.000000 |
| 75% | 77.000000 | 156.000000 | 0.001500 | 0.000300 | 100.0 | 5.186700e+02 | 643.000000 | 1594.380000 | 1414.555000 | 1.462000e+01 | ... | 0.023380 | 0.0 | 1.140175 | 0.0 | 0.0 | 0.117132 | 0.069839 | 155.000000 | 0.000000 | 0.000000 |
| max | 100.000000 | 362.000000 | 0.008700 | 0.000600 | 100.0 | 5.186700e+02 | 644.530000 | 1616.910000 | 1441.490000 | 1.462000e+01 | ... | 0.065761 | 0.0 | 2.828427 | 0.0 | 0.0 | 0.325269 | 0.187313 | 361.000000 | 1.000000 | 2.000000 |
8 rows × 71 columns
df_test.describe()
| id | cycle | setting1 | setting2 | setting3 | s1 | s2 | s3 | s4 | s5 | ... | sd15 | sd16 | sd17 | sd18 | sd19 | sd20 | sd21 | ttf | label_bnc | label_mcc | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 100.000000 | 100.000000 | 100.000000 | 100.000000 | 100.0 | 1.000000e+02 | 100.000000 | 100.000000 | 100.000000 | 1.000000e+02 | ... | 100.000000 | 100.0 | 100.000000 | 100.0 | 100.0 | 100.000000 | 100.000000 | 100.00000 | 100.000000 | 100.000000 |
| mean | 50.500000 | 130.960000 | -0.000073 | 0.000022 | 100.0 | 5.186700e+02 | 642.768400 | 1591.824700 | 1410.548200 | 1.462000e+01 | ... | 0.019207 | 0.0 | 0.889000 | 0.0 | 0.0 | 0.093899 | 0.057975 | 75.52000 | 0.250000 | 0.350000 |
| std | 29.011492 | 53.593479 | 0.002353 | 0.000306 | 0.0 | 1.142596e-12 | 0.444592 | 6.646293 | 8.626344 | 2.856489e-14 | ... | 0.008033 | 0.0 | 0.307613 | 0.0 | 0.0 | 0.035885 | 0.020325 | 41.76497 | 0.435194 | 0.657129 |
| min | 1.000000 | 31.000000 | -0.005900 | -0.000500 | 100.0 | 5.186700e+02 | 641.750000 | 1576.930000 | 1389.330000 | 1.462000e+01 | ... | 0.004287 | 0.0 | 0.000000 | 0.0 | 0.0 | 0.015166 | 0.018966 | 7.00000 | 0.000000 | 0.000000 |
| 25% | 25.750000 | 88.750000 | -0.001650 | -0.000300 | 100.0 | 5.186700e+02 | 642.490000 | 1587.007500 | 1403.912500 | 1.462000e+01 | ... | 0.013697 | 0.0 | 0.707107 | 0.0 | 0.0 | 0.070107 | 0.042731 | 32.75000 | 0.000000 | 0.000000 |
| 50% | 50.500000 | 133.500000 | -0.000250 | 0.000100 | 100.0 | 5.186700e+02 | 642.775000 | 1591.365000 | 1410.300000 | 1.462000e+01 | ... | 0.018009 | 0.0 | 0.836660 | 0.0 | 0.0 | 0.088544 | 0.055796 | 86.00000 | 0.000000 | 0.000000 |
| 75% | 75.250000 | 164.250000 | 0.001300 | 0.000300 | 100.0 | 5.186700e+02 | 643.025000 | 1597.280000 | 1416.922500 | 1.462000e+01 | ... | 0.023288 | 0.0 | 1.140175 | 0.0 | 0.0 | 0.114105 | 0.072792 | 112.25000 | 0.250000 | 0.250000 |
| max | 100.000000 | 303.000000 | 0.007600 | 0.000500 | 100.0 | 5.186700e+02 | 644.030000 | 1607.550000 | 1428.420000 | 1.462000e+01 | ... | 0.049270 | 0.0 | 1.483240 | 0.0 | 0.0 | 0.187216 | 0.115700 | 145.00000 | 1.000000 | 2.000000 |
8 rows × 71 columns
# 누락된 값 확인
df_train.isnull().sum()
id 0
cycle 0
setting1 0
setting2 0
setting3 0
..
sd20 0
sd21 0
ttf 0
label_bnc 0
label_mcc 0
Length: 71, dtype: int64
Data 시각화
데이터를 시각화하면 다양한 feature가 어떻게 분포되어 있는지에 대한 아이디어를 얻을 수 있으므로 분석에 도움이 됩니다.
features = []
for col in df_train.columns:
features.append(col)
# 입력 feature의 표준 편차를 그려서 비교합니다:
df_train[features].std().plot(kind='bar', figsize=(10,6), title="Features Standard Deviation")
<AxesSubplot:title={'center':'Features Standard Deviation'}>
feature 간의 상관 관계를 확인합니다.
# 더 나은 시각화를 위해 feature의 하위 집합인 feat를 사용하여 상관관계 행렬을 그려봅니다.
feat= ['s12',
's7',
's21',
's20',
's6',
's14',
's9',
's13',
's8',
's3',
's17',
's2',
's15',
's4',
's11',
'ttf']
import seaborn as sns
cm = np.corrcoef(df_train[feat].values.T)
sns.set(font_scale=1.0)
fig = plt.figure(figsize=(10, 8))
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 8}, yticklabels=feat, xticklabels=feat)
plt.title('Features Correlation Heatmap')
plt.show()
선형 회귀를 위한 데이터 준비
# 회귀 모델을 위한 데이터를 준비합시다.
# 원본 feature 리스트 입니다.
features_orig = ['setting1','setting2','setting3','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11','s12','s13','s14','s15','s16','s17','s18','s19','s20','s21']
# 회귀 레이블과 상관 관계가 낮거나 없는 feature 리스트 입니다.
features_lowcr = ['setting3', 's1', 's10', 's18','s19','s16','s5', 'setting1', 'setting2']
# 회귀 레이블과 상관 관계가 있는 feature 리스트 입니다.
features_corrl = ['s2', 's3', 's4', 's6', 's7', 's8', 's9', 's11', 's12', 's13', 's14', 's15', 's17', 's20','s21']
features_best = ['s9', 'av9', 's14', 'av14', 's4', 'av4', 's3', 'av3']
# features는 실험할 feature 집합을 보유하는 변수이다.
features = features_orig
# features = features_corrl
X_train = df_train[features]
y_train = df_train['ttf']
X_test = df_test[features]
y_test = df_test['ttf']
Helper 함수
def get_regression_metrics(model, actual, predicted):
"""Calculate main regression metrics.
Args:
model (str): The model name identifier
actual (series): Contains the test label values
predicted (series): Contains the predicted values
Returns:
dataframe: The combined metrics in single dataframe
"""
regr_metrics = {
'Root Mean Squared Error' : metrics.mean_squared_error(actual, predicted)**0.5,
'Mean Absolute Error' : metrics.mean_absolute_error(actual, predicted),
'R^2' : metrics.r2_score(actual, predicted),
'Explained Variance' : metrics.explained_variance_score(actual, predicted)
}
# reg_metrics 반환
df_regr_metrics = pd.DataFrame.from_dict(regr_metrics, orient='index')
df_regr_metrics.columns = [model]
return df_regr_metrics
def plot_features_weights(model, weights, feature_names, weights_type='c'):
"""Plot regression coefficients weights or feature importance.
Args:
model (str): The model name identifier
weights (array): Contains the regression coefficients weights or feature importance
feature_names (list): Contains the corresponding features names
weights_type (str): 'c' for 'coefficients weights', otherwise is 'feature importance'
Returns:
plot of either regression coefficients weights or feature importance
"""
(px, py) = (8, 10) if len(weights) > 30 else (8, 5)
W = pd.DataFrame({'Weights':weights}, feature_names)
W.sort_values(by='Weights', ascending=True).plot(kind='barh', color='r', figsize=(px,py))
label = ' Coefficients' if weights_type =='c' else ' Features Importance'
plt.xlabel(model + label)
plt.gca().legend_ = None
def plot_residual(model, y_train, y_train_pred, y_test, y_test_pred):
"""Print the regression residuals.
Args:
model (str): The model name identifier
y_train (series): The training labels
y_train_pred (series): Predictions on training data
y_test (series): The test labels
y_test_pred (series): Predictions on test data
Returns:
Plot of regression residuals
"""
plt.scatter(y_train_pred, y_train_pred - y_train, c='blue', marker='o', label='Training data')
plt.scatter(y_test_pred, y_test_pred - y_test, c='lightgreen', marker='s', label='Test data')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.legend(loc='upper left')
plt.hlines(y=0, xmin=-50, xmax=400, color='red', lw=2)
plt.title(model + ' Residuals')
plt.show()
선형 회귀 모델
선형 회귀는 종속 변수(출력)와 하나 이상의 독립 변수(입력) 간의 관계를 모델링하는 간단한 모델입니다.

RMSE
RMSE는 평균 제곱근 오차를 나타냅니다. 기계 학습 모델을 사용하여 예측을 수행할 때 예측이 정확한지 확인해야 합니다. RMSE는 예측 오류를 측정하는 방법입니다. RMSE가 높으면 예측이 나쁘고, 낮으면 예측이 좋은 것입니다.
MAE
MAE는 평균 절대 오차를 나타냅니다. RMSE와 마찬가지로 MAE는 예측의 오류를 측정하는 방법입니다. MAE가 높으면 예측이 나쁘고 그 반대의 경우 좋은 것입니다.
linreg = linear_model.LinearRegression()
linreg.fit(X_train, y_train)
y_test_lin_predict = linreg.predict(X_test)
y_train_lin_predict = linreg.predict(X_train)
print('R^2 training: %.3f, R^2 test: %.3f' % (
(metrics.r2_score(y_train, y_train_lin_predict)),
(metrics.r2_score(y_test, y_test_lin_predict))))
linreg_metrics = get_regression_metrics('Linear Regression', y_test, y_test_lin_predict)
linreg_metrics
R^2 training: 0.580, R^2 test: 0.405
| Linear Regression | |
|---|---|
| Root Mean Squared Error | 32.041095 |
| Mean Absolute Error | 25.591780 |
| R^2 | 0.405495 |
| Explained Variance | 0.665297 |
Task 3: 선형 회귀로 얻은 feature의 가중치를 그려봅니다.
# your code here
# def plot_features_weights(model, weights, feature_names, weights_type='c'):
import scipy.stats as stats
t_cm = np.corrcoef(X_test.values.T, y_test.values)
# stats.pearsonr(X_test.values[0], y_test.values)
t_cm[24]
plot_features_weights('Linear Regression', linreg.coef_, features_orig)
C:\Users\User\anaconda3\envs\myai\lib\site-packages\numpy\lib\function_base.py:2853: RuntimeWarning: invalid value encountered in divide c /= stddev[:, None] C:\Users\User\anaconda3\envs\myai\lib\site-packages\numpy\lib\function_base.py:2854: RuntimeWarning: invalid value encountered in divide c /= stddev[None, :]
setting2, setting1, s1, s2 등의 데이터 모델의 매개변수가 그래프에 표시되어 있습니다. setting2와 s6의 빨간색 선이 가장 긴 것을 볼 수 있습니다. 그 feature들이 가장 중요합니다.
Task 4: 선형 회귀로 얻은 산정도 그려보기
# def plot_residual(model, y_train, y_train_pred, y_test, y_test_pred):
plot_residual('Linear Regression', y_train, y_train_predict, y_test, y_test_predict)
추가로..
강사님께서 보내본 아래코드로 한번 해보자.
# 이걸 다른 상업용으로 쓸려면 객체 이름 등 좀 바꿔서;;;
def explore_col(s):
fig = plt.figure(figsize=(10, 8))
sub1 = fig.add_subplot(331)
sub1.set_title(s +' histogram')
sub1.hist(df_train[s])
sub2 = fig.add_subplot(332)
sub2.set_title(s +' boxplot')
sub2.boxplot(df_train[s])
sub4 = fig.add_subplot(333)
sub4.set_title("scatter: "+ s + " / ttf (regr label)")
sub4.set_xlabel('ttf')
sub4.scatter(df_train['ttf'],df_train[s])
plt.tight_layout()
plt.show()
for c in features_best:
explore_col(c)
ttf_cor = df_train[feat].corrwith(df_train.ttf).sort_values(ascending=False)
abs(ttf_cor).sort_values(ascending=False)
ttf 1.000000 s11 0.696228 s4 0.678948 s12 0.671983 s7 0.657223 s15 0.642667 s21 0.635662 s20 0.629428 s2 0.606484 s17 0.606154 s3 0.584520 s8 0.563968 s13 0.562569 s9 0.390102 s14 0.306769 s6 0.128348 dtype: float64
기본적으로…
이정도면 될 거 같은데..
그렇다면… 이 이상으로 위 데이터 성능을 좋게 해야한다면 어떻게 해 야 될까?
-
선형말고 다른 모델도 해보자.
-
수치도 여러모로 변경해봐서 제일 높은 점수가 나올만한 경우를 생각해보자.
…. 그 뒤 생각나면;;;
LASSO, RidgeReg, Random Forest등 다른 모델도 돌려보기..
LASSO
# sklearn 다른 모델들은 불러오돼.. 공통적인 부분은 앞에 미리 선언하고..
from sklearn.linear_model import Lasso
lasso_reg = Lasso()
lasso_reg.fit(X_train, y_train)
y_test_lso_predict = lasso_reg.predict(X_test)
y_train_lso_predict = lasso_reg.predict(X_train)
print('R^2 training: %.3f, R^2 test: %.3f' % (
(metrics.r2_score(y_train, y_train_lso_predict)),
(metrics.r2_score(y_test, y_test_lso_predict))))
Lasso_metrics = get_regression_metrics('LASSO Regression', y_test, y_test_lso_predict)
Lasso_metrics
R^2 training: 0.566, R^2 test: 0.314
| LASSO Regression | |
|---|---|
| Root Mean Squared Error | 34.417296 |
| Mean Absolute Error | 27.705612 |
| R^2 | 0.314048 |
| Explained Variance | 0.620222 |
Ridge Regression
from sklearn.linear_model import Ridge
ridge_reg = Ridge(alpha=.3, normalize=True)
# copy_X=True
ridge_reg.fit(X_train, y_train)
y_test_rdg_predict = ridge_reg.predict(X_test)
y_train_rdg_predict = ridge_reg.predict(X_train)
print('R^2 training: %.3f, R^2 test: %.3f' % (
(metrics.r2_score(y_train, y_train_rdg_predict)),
(metrics.r2_score(y_test, y_test_rdg_predict))))
Ridge_metrics = get_regression_metrics('Ridge Regression', y_test, y_test_rdg_predict)
Ridge_metrics
R^2 training: 0.578, R^2 test: 0.441
C:\Users\User\anaconda3\envs\myai\lib\site-packages\sklearn\linear_model\_base.py:141: FutureWarning: 'normalize' was deprecated in version 1.0 and will be removed in 1.2.
If you wish to scale the data, use Pipeline with a StandardScaler in a preprocessing stage. To reproduce the previous behavior:
from sklearn.pipeline import make_pipeline
model = make_pipeline(StandardScaler(with_mean=False), Ridge())
If you wish to pass a sample_weight parameter, you need to pass it as a fit parameter to each step of the pipeline as follows:
kwargs = {s[0] + '__sample_weight': sample_weight for s in model.steps}
model.fit(X, y, **kwargs)
Set parameter alpha to: original_alpha * n_samples.
warnings.warn(
| Ridge Regression | |
|---|---|
| Root Mean Squared Error | 31.067255 |
| Mean Absolute Error | 25.021391 |
| R^2 | 0.441084 |
| Explained Variance | 0.693551 |
Random Forest
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators = 155, max_depth=5,
random_state = 0, warm_start=True)
# min_samples_split=1, max_features, random_state = 0(default)
# bootstrap = False, oob_score = True, n_jobs=3, verbose=3
# node 수 : 155가 최선.. max_depth : 5, random_state = 0.. 이렇게.. : 648...
rfc.fit(X_train, y_train)
y_test_rfc_predict = rfc.predict(X_test)
y_train_rfc_predict = rfc.predict(X_train)
print('R^2 training: %.3f, R^2 test: %.3f' % (
(metrics.r2_score(y_train, y_train_rfc_predict)),
(metrics.r2_score(y_test, y_test_rfc_predict))))
RFC_metrics = get_regression_metrics('RandomForestClassifier', y_test, y_test_rfc_predict)
RFC_metrics
R^2 training: 0.467, R^2 test: 0.648
| RandomForestClassifier | |
|---|---|
| Root Mean Squared Error | 24.644066 |
| Mean Absolute Error | 18.150000 |
| R^2 | 0.648306 |
| Explained Variance | 0.657069 |
총합 비교
Total_metrics = pd.concat([linreg_metrics, Lasso_metrics, Ridge_metrics, RFC_metrics], axis = 1)
Total_metrics
| Linear Regression | LASSO Regression | Ridge Regression | RandomForestClassifier | |
|---|---|---|---|---|
| Root Mean Squared Error | 32.041095 | 34.417296 | 31.966557 | 24.644066 |
| Mean Absolute Error | 25.591780 | 27.705612 | 25.554325 | 18.150000 |
| R^2 | 0.405495 | 0.314048 | 0.408258 | 0.648306 |
| Explained Variance | 0.665297 | 0.620222 | 0.668870 | 0.657069 |
후기
-
랜덤포레스트로 위 데이터를 어느정도 성능을 최대한 가능한지 적용이 되어있음.
-
Ridge도 어느정도 변수를 줘서 R2성능을 조금 끌어올려봄.
-
나머지도 추후 여유가 된다면 여러 변수를 줘봐서 R2확인예정.
주의사항
본 포트폴리오는 인텔 AI 저작권에 따라 그대로 사용하기에 상업적으로 사용하기 어려움을 말씀드립니다.
댓글남기기