11 분 소요

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()

선형 회귀 모델

선형 회귀는 종속 변수(출력)와 하나 이상의 독립 변수(입력) 간의 관계를 모델링하는 간단한 모델입니다.

linear regression

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 저작권에 따라 그대로 사용하기에 상업적으로 사용하기 어려움을 말씀드립니다.

댓글남기기