25 분 소요

비만 예방을 위한 분석 AI모델 구축

  1. 비만 예방을 위해 비만에 걱정하시는 분들을 위한 AI솔루션
  2. 어떻게 예방할지 AI를 통해 적기에 사람들에게 솔루션 제공이 중요.
  3. 백문이 불여일견 진행시작

진행 순서

  1. .csv 파일 읽어오기 (test.csv, train.csv): df_test / df_train

  2. Data 크기 확인하기(test, train)

  3. Data SET 첫 5행 확인하기(test, train)

  4. Data SET 통계값, Null 값 확인하기 (null 값이 있는 경우 행 삭제)

  5. “activity” 컬럼의 Unique 값, Unique count 값 확인 하기

  6. “activity” 컬럼의 Unique count 값 그래프 그리기

  7. rn 열 drop (df_test / df_train)

  8. “activity” 컬럼에 대하여 인코딩 하기

  9. df_train 으로 X = “특성 컬럼”, y = “activity” 만들기

  10. X_train, X_test, y_train, y_test 만들기

  11. X_train, X_test 정규화 하기(옵션)

  12. AI Model : 분류

  13. .fit // .predict // score (정확도, 정밀도, 재현율, F1 Score)

  14. df_test 에 대한 분류 하여 “activity” 컬럼 작성하여 test_result.csv 파일 만들기 (6가지 클래스로만…)

<’df_test’의 경우 정답 없는 문제지라 AI에게 테스트로 predict로 던져보는… 디코딩해서 만든게 test_result.csv>

  1. 결과 보고

0. 필요한 라이브러리..

  • 두말할 거 없이 이번 캡스톤1에 필요한 라이브러리를 가져오는건 기본.

  • 여기서 KNN, GNB, MNB, LR, RFC 그 외 XGBoost 등등 들어본 머신러닝들을 활용.

이웃, 네이브베어, 선형모델, 앙상블 랜덤포레스트분류 등


# 기본적인 부분 우선...
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# 훈련 및 필요한 여러모로의 모델들
from sklearn.model_selection import train_test_split # 분리
from sklearn.preprocessing import StandardScaler # 정규화.
from sklearn.metrics import classification_report # 성능 요약

from sklearn import tree # Decision Tree
from sklearn import svm # support vector machine
from sklearn.neighbors import KNeighborsClassifier # KNN
from sklearn.naive_bayes import GaussianNB # GNB
from sklearn.naive_bayes import MultinomialNB # MNB
from sklearn.linear_model import LogisticRegression # LR..
from sklearn.ensemble import RandomForestClassifier # RFC

from xgboost import XGBClassifier # Xgboost

1. .csv 파일 읽어오기

rn activity tBodyAcc.mean.X tBodyAcc.mean.Y tBodyAcc.mean.Z tBodyAcc.std.X tBodyAcc.std.Y tBodyAcc.std.Z tBodyAcc.mad.X tBodyAcc.mad.Y ... fBodyBodyGyroJerkMag.meanFreq fBodyBodyGyroJerkMag.skewness fBodyBodyGyroJerkMag.kurtosis angle.tBodyAccMean.gravity angle.tBodyAccJerkMean.gravityMean angle.tBodyGyroMean.gravityMean angle.tBodyGyroJerkMean.gravityMean angle.X.gravityMean angle.Y.gravityMean angle.Z.gravityMean
0 7 STANDING 0.279 -0.0196 -0.1100 -0.997 -0.967 -0.983 -0.997 -0.966 ... 0.146 -0.217 -0.5640 -0.2130 -0.2310 0.0146 -0.190 -0.852 0.182 -0.0430
1 11 STANDING 0.277 -0.0127 -0.1030 -0.995 -0.973 -0.985 -0.996 -0.974 ... 0.121 0.349 0.0577 0.0807 0.5960 -0.4760 0.116 -0.852 0.188 -0.0347
2 14 STANDING 0.277 -0.0147 -0.1070 -0.999 -0.991 -0.993 -0.999 -0.991 ... 0.740 -0.564 -0.7660 0.1060 -0.0903 -0.1320 0.499 -0.850 0.189 -0.0351
3 15 STANDING 0.298 0.0271 -0.0617 -0.989 -0.817 -0.902 -0.989 -0.794 ... 0.131 0.208 -0.0681 0.0623 -0.0587 0.0312 -0.269 -0.731 0.283 0.0364
4 20 STANDING 0.276 -0.0170 -0.1110 -0.998 -0.991 -0.998 -0.998 -0.989 ... 0.667 -0.942 -0.9660 0.2450 0.1030 0.0661 -0.412 -0.761 0.263 0.0296

5 rows × 563 columns

Index(['rn', 'activity', 'tBodyAcc.mean.X', 'tBodyAcc.mean.Y',
       'tBodyAcc.mean.Z', 'tBodyAcc.std.X', 'tBodyAcc.std.Y', 'tBodyAcc.std.Z',
       'tBodyAcc.mad.X', 'tBodyAcc.mad.Y',
       ...
       'fBodyBodyGyroJerkMag.meanFreq', 'fBodyBodyGyroJerkMag.skewness',
       'fBodyBodyGyroJerkMag.kurtosis', 'angle.tBodyAccMean.gravity',
       'angle.tBodyAccJerkMean.gravityMean', 'angle.tBodyGyroMean.gravityMean',
       'angle.tBodyGyroJerkMean.gravityMean', 'angle.X.gravityMean',
       'angle.Y.gravityMean', 'angle.Z.gravityMean'],
      dtype='object', length=563)

방금 진행한 작업은 위 head데이터에서 어떠한 목록들이 있는가 한번 확인해 보기 위해 넣어본 것.

<bound method DataFrame.info of          rn            activity  tBodyAcc.mean.X  tBodyAcc.mean.Y  \
0         7            STANDING            0.279         -0.01960   
1        11            STANDING            0.277         -0.01270   
2        14            STANDING            0.277         -0.01470   
3        15            STANDING            0.298          0.02710   
4        20            STANDING            0.276         -0.01700   
...     ...                 ...              ...              ...   
3604  10277    WALKING_UPSTAIRS            0.357         -0.04460   
3605  10278    WALKING_UPSTAIRS            0.344          0.00479   
3606  10279    WALKING_UPSTAIRS            0.284         -0.00796   
3607  10280    WALKING_UPSTAIRS            0.207          0.02460   
3608  10281  WALKING_DOWNSTAIRS            0.393         -0.01780   

......

[3609 rows x 563 columns]>

test도 동일하게 진행.

rn tBodyAcc.mean.X tBodyAcc.mean.Y tBodyAcc.mean.Z tBodyAcc.std.X tBodyAcc.std.Y tBodyAcc.std.Z tBodyAcc.mad.X tBodyAcc.mad.Y tBodyAcc.mad.Z ... fBodyBodyGyroJerkMag.meanFreq fBodyBodyGyroJerkMag.skewness fBodyBodyGyroJerkMag.kurtosis angle.tBodyAccMean.gravity angle.tBodyAccJerkMean.gravityMean angle.tBodyGyroMean.gravityMean angle.tBodyGyroJerkMean.gravityMean angle.X.gravityMean angle.Y.gravityMean angle.Z.gravityMean
0 3 0.280 -0.0195 -0.113 -0.995 -0.967 -0.979 -0.997 -0.964 -0.977 ... 0.4150 -0.391 -0.760 -0.11900 0.1780 0.101 0.809 -0.849 0.181 -0.0491
1 5 0.277 -0.0166 -0.115 -0.998 -0.981 -0.990 -0.998 -0.980 -0.990 ... 0.0878 -0.351 -0.699 0.12300 0.1230 0.694 -0.616 -0.848 0.185 -0.0439
2 9 0.277 -0.0218 -0.121 -0.997 -0.961 -0.984 -0.998 -0.957 -0.984 ... 0.3140 -0.269 -0.573 0.01300 0.0809 -0.234 0.118 -0.848 0.189 -0.0374
3 17 0.279 -0.0148 -0.117 -0.997 -0.982 -0.983 -0.997 -0.982 -0.981 ... 0.5610 -0.779 -0.940 -0.00145 -0.0481 -0.340 -0.229 -0.759 0.264 0.0270
4 26 0.279 -0.0145 -0.107 -0.998 -0.986 -0.993 -0.998 -0.985 -0.995 ... 0.6770 -0.715 -0.937 0.02570 0.0665 -0.226 -0.225 -0.762 0.262 0.0294

5 rows × 562 columns

Index(['rn', 'tBodyAcc.mean.X', 'tBodyAcc.mean.Y', 'tBodyAcc.mean.Z',
       'tBodyAcc.std.X', 'tBodyAcc.std.Y', 'tBodyAcc.std.Z', 'tBodyAcc.mad.X',
       'tBodyAcc.mad.Y', 'tBodyAcc.mad.Z',
       ...
       'fBodyBodyGyroJerkMag.meanFreq', 'fBodyBodyGyroJerkMag.skewness',
       'fBodyBodyGyroJerkMag.kurtosis', 'angle.tBodyAccMean.gravity',
       'angle.tBodyAccJerkMean.gravityMean', 'angle.tBodyGyroMean.gravityMean',
       'angle.tBodyGyroJerkMean.gravityMean', 'angle.X.gravityMean',
       'angle.Y.gravityMean', 'angle.Z.gravityMean'],
      dtype='object', length=562)
<bound method DataFrame.info of          rn  tBodyAcc.mean.X  tBodyAcc.mean.Y  tBodyAcc.mean.Z  \
0         3            0.280         -0.01950          -0.1130   
1         5            0.277         -0.01660          -0.1150   
2         9            0.277         -0.02180          -0.1210   
3        17            0.279         -0.01480          -0.1170   
4        26            0.279         -0.01450          -0.1070   
...     ...              ...              ...              ...   
1536  10255            0.289         -0.02810          -0.0943   
1537  10270            0.377         -0.01810          -0.1100   
1538  10272            0.253         -0.02490          -0.1700   
1539  10289            0.277          0.00108          -0.0740   
1540  10294            0.192         -0.03360          -0.1060   

......

[1541 rows x 562 columns]>

2. Data 크기 확인하기

  • 대략 적인 크기 및 정보는 위에 info등을 통해 나와버렸으나 자세한 부분을 여기 담음

  • 세부적인 그래프 비교는 추후에..

rn tBodyAcc.mean.X tBodyAcc.mean.Y tBodyAcc.mean.Z tBodyAcc.std.X tBodyAcc.std.Y tBodyAcc.std.Z tBodyAcc.mad.X tBodyAcc.mad.Y tBodyAcc.mad.Z ... fBodyBodyGyroJerkMag.meanFreq fBodyBodyGyroJerkMag.skewness fBodyBodyGyroJerkMag.kurtosis angle.tBodyAccMean.gravity angle.tBodyAccJerkMean.gravityMean angle.tBodyGyroMean.gravityMean angle.tBodyGyroJerkMean.gravityMean angle.X.gravityMean angle.Y.gravityMean angle.Z.gravityMean
count 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 ... 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000 3609.000000
mean 5152.430590 0.274544 -0.017415 -0.109195 -0.608457 -0.506265 -0.614482 -0.634634 -0.521660 -0.616047 ... 0.128804 -0.300815 -0.619400 0.007561 0.009484 0.029185 -0.010632 -0.496977 0.060040 -0.050202
std 2975.767839 0.063589 0.042589 0.056218 0.439157 0.501627 0.399514 0.413194 0.485282 0.394932 ... 0.240278 0.317963 0.308303 0.332249 0.448971 0.613615 0.490830 0.509336 0.311308 0.263935
min 7.000000 -0.521000 -1.000000 -0.926000 -1.000000 -0.999000 -1.000000 -1.000000 -0.999000 -1.000000 ... -0.786000 -0.968000 -0.995000 -0.969000 -0.997000 -1.000000 -0.993000 -0.999000 -1.000000 -0.971000
25% 2570.000000 0.262000 -0.025200 -0.122000 -0.992000 -0.976000 -0.979000 -0.993000 -0.976000 -0.978000 ... -0.015800 -0.533000 -0.836000 -0.118000 -0.281000 -0.478000 -0.398000 -0.816000 -0.015600 -0.122000
50% 5158.000000 0.277000 -0.017200 -0.109000 -0.939000 -0.812000 -0.844000 -0.946000 -0.816000 -0.837000 ... 0.132000 -0.341000 -0.706000 0.007740 0.009830 0.029600 -0.013400 -0.716000 0.183000 -0.005260
75% 7727.000000 0.287000 -0.011000 -0.098000 -0.254000 -0.051700 -0.283000 -0.306000 -0.084500 -0.288000 ... 0.290000 -0.118000 -0.501000 0.142000 0.309000 0.554000 0.374000 -0.522000 0.252000 0.104000
max 10281.000000 0.693000 1.000000 1.000000 1.000000 0.980000 1.000000 1.000000 0.988000 1.000000 ... 0.871000 0.990000 0.957000 0.981000 0.997000 0.999000 0.996000 0.977000 1.000000 0.998000

8 rows × 562 columns

  • 열 확인
rn                                       int64
activity                                object
tBodyAcc.mean.X                        float64
tBodyAcc.mean.Y                        float64
tBodyAcc.mean.Z                        float64
                                        ...   
angle.tBodyGyroMean.gravityMean        float64
angle.tBodyGyroJerkMean.gravityMean    float64
angle.X.gravityMean                    float64
angle.Y.gravityMean                    float64
angle.Z.gravityMean                    float64
Length: 563, dtype: object
  • 유니크 개수 확인
rn                                     3609
activity                                  6
tBodyAcc.mean.X                         375
tBodyAcc.mean.Y                        1243
tBodyAcc.mean.Z                         689
                                       ... 
angle.tBodyGyroMean.gravityMean        1843
angle.tBodyGyroJerkMean.gravityMean    1847
angle.X.gravityMean                     940
angle.Y.gravityMean                    1172
angle.Z.gravityMean                    1892
Length: 563, dtype: int64
  • 요약.
rn tBodyAcc.mean.X tBodyAcc.mean.Y tBodyAcc.mean.Z tBodyAcc.std.X tBodyAcc.std.Y tBodyAcc.std.Z tBodyAcc.mad.X tBodyAcc.mad.Y tBodyAcc.mad.Z ... fBodyBodyGyroJerkMag.meanFreq fBodyBodyGyroJerkMag.skewness fBodyBodyGyroJerkMag.kurtosis angle.tBodyAccMean.gravity angle.tBodyAccJerkMean.gravityMean angle.tBodyGyroMean.gravityMean angle.tBodyGyroJerkMean.gravityMean angle.X.gravityMean angle.Y.gravityMean angle.Z.gravityMean
count 1541.000000 1541.00000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 ... 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000 1541.000000
mean 5161.052563 0.27582 -0.018046 -0.109217 -0.607266 -0.516822 -0.617703 -0.632406 -0.532077 -0.619526 ... 0.132199 -0.316954 -0.634735 0.008390 0.014311 -0.000550 0.006301 -0.493145 0.061068 -0.054510
std 3018.400705 0.06066 0.024662 0.046271 0.440922 0.499209 0.400243 0.416450 0.483753 0.396243 ... 0.246591 0.313443 0.297231 0.338114 0.450936 0.621036 0.482773 0.511159 0.303507 0.270579
min 3.000000 -0.41000 -0.268000 -0.347000 -0.999000 -1.000000 -0.999000 -0.999000 -1.000000 -1.000000 ... -0.786000 -1.000000 -0.993000 -1.000000 -1.000000 -0.999000 -0.991000 -0.997000 -0.987000 -0.971000
25% 2504.000000 0.26300 -0.024800 -0.121000 -0.992000 -0.978000 -0.980000 -0.993000 -0.979000 -0.979000 ... -0.014900 -0.551000 -0.848000 -0.129000 -0.279000 -0.526000 -0.370000 -0.814000 -0.018400 -0.136000
50% 5064.000000 0.27700 -0.017200 -0.109000 -0.945000 -0.865000 -0.862000 -0.951000 -0.869000 -0.857000 ... 0.141000 -0.353000 -0.718000 0.011900 0.027500 -0.004190 0.001220 -0.723000 0.183000 -0.002240
75% 7888.000000 0.28900 -0.010400 -0.098300 -0.239000 -0.062700 -0.273000 -0.290000 -0.082100 -0.287000 ... 0.293000 -0.140000 -0.523000 0.148000 0.301000 0.527000 0.377000 -0.512000 0.249000 0.103000
max 10294.000000 0.56400 0.153000 0.719000 0.718000 1.000000 0.753000 0.722000 1.000000 0.728000 ... 0.947000 0.941000 0.927000 1.000000 1.000000 0.993000 0.991000 0.912000 0.901000 0.991000

8 rows × 562 columns

  • 타입 체크.
rn                                       int64
tBodyAcc.mean.X                        float64
tBodyAcc.mean.Y                        float64
tBodyAcc.mean.Z                        float64
tBodyAcc.std.X                         float64
                                        ...   
angle.tBodyGyroMean.gravityMean        float64
angle.tBodyGyroJerkMean.gravityMean    float64
angle.X.gravityMean                    float64
angle.Y.gravityMean                    float64
angle.Z.gravityMean                    float64
Length: 562, dtype: object
  • 유니크 개수 확인
rn                                     1541
tBodyAcc.mean.X                         288
tBodyAcc.mean.Y                         729
tBodyAcc.mean.Z                         417
tBodyAcc.std.X                          593
                                       ... 
angle.tBodyGyroMean.gravityMean        1091
angle.tBodyGyroJerkMean.gravityMean    1097
angle.X.gravityMean                     683
angle.Y.gravityMean                     725
angle.Z.gravityMean                    1084
Length: 562, dtype: int64

3. Data SET 첫 5행 확인하기(test, train)

  • 이미 위에 확인했기에 패스

4. Data SET 통계값, Null 값 확인하기 (null 값이 있는 경우 행 삭제)

  • 통계값 확인은 위 데이터를 근거로 괜찮을 것이라 생각.

  • null값 확인은 해보아야..

  • null값 확인 결과

rn                                     0
activity                               0
tBodyAcc.mean.X                        0
tBodyAcc.mean.Y                        0
tBodyAcc.mean.Z                        0
                                      ..
angle.tBodyGyroMean.gravityMean        0
angle.tBodyGyroJerkMean.gravityMean    0
angle.X.gravityMean                    0
angle.Y.gravityMean                    0
angle.Z.gravityMean                    0
Length: 563, dtype: int64
  • test값도 확인
rn                                     0
tBodyAcc.mean.X                        0
tBodyAcc.mean.Y                        0
tBodyAcc.mean.Z                        0
tBodyAcc.std.X                         0
                                      ..
angle.tBodyGyroMean.gravityMean        0
angle.tBodyGyroJerkMean.gravityMean    0
angle.X.gravityMean                    0
angle.Y.gravityMean                    0
angle.Z.gravityMean                    0
Length: 562, dtype: int64

5. “activity” 컬럼의 Unique 값, Unique count 값 확인 하기

  • 전체적인 대상의 활동 데이터를 보고 앞으로 어떻게 행동할지 예측 및 조언할 데이터가 activity

  • 여기서 정보 확인은 중요..

array(['STANDING', 'SITTING', 'LAYING', 'WALKING', 'WALKING_DOWNSTAIRS',
       'WALKING_UPSTAIRS'], dtype=object)
  • 유니크 개수 확인
6
  • 왜 강사님께서 6클래스 진행하면 된다고 하는지 위 데이터 답지들을 보고 이해.

6. “activity” 컬럼의 Unique count 값 그래프 그리기

  • 어떤 차트가 나은지 고찰은 진행해봐야..

  • 일단 진행.
  • solution에 관한 차트 비교도 진행.
LAYING                681
STANDING              668
SITTING               623
WALKING               603
WALKING_UPSTAIRS      541
WALKING_DOWNSTAIRS    493
Name: activity, dtype: int64
  • 꺾은선 그래프 등은 추후에 여유되면.

7. rn 열 drop (df_test / df_train)

  • rn열은 대상의 유니크번호이겠으나 분석등 판단에는 필요없어보이기에 삭제.

  • 아래 2표는 기존 데이터와 삭제된 열 데이터로 구분

rn activity tBodyAcc.mean.X tBodyAcc.mean.Y tBodyAcc.mean.Z tBodyAcc.std.X tBodyAcc.std.Y tBodyAcc.std.Z tBodyAcc.mad.X tBodyAcc.mad.Y ... fBodyBodyGyroJerkMag.meanFreq fBodyBodyGyroJerkMag.skewness fBodyBodyGyroJerkMag.kurtosis angle.tBodyAccMean.gravity angle.tBodyAccJerkMean.gravityMean angle.tBodyGyroMean.gravityMean angle.tBodyGyroJerkMean.gravityMean angle.X.gravityMean angle.Y.gravityMean angle.Z.gravityMean
0 7 STANDING 0.279 -0.01960 -0.1100 -0.9970 -0.9670 -0.983 -0.997 -0.9660 ... 0.1460 -0.2170 -0.5640 -0.2130 -0.2310 0.0146 -0.1900 -0.852 0.182 -0.0430
1 11 STANDING 0.277 -0.01270 -0.1030 -0.9950 -0.9730 -0.985 -0.996 -0.9740 ... 0.1210 0.3490 0.0577 0.0807 0.5960 -0.4760 0.1160 -0.852 0.188 -0.0347
2 14 STANDING 0.277 -0.01470 -0.1070 -0.9990 -0.9910 -0.993 -0.999 -0.9910 ... 0.7400 -0.5640 -0.7660 0.1060 -0.0903 -0.1320 0.4990 -0.850 0.189 -0.0351
3 15 STANDING 0.298 0.02710 -0.0617 -0.9890 -0.8170 -0.902 -0.989 -0.7940 ... 0.1310 0.2080 -0.0681 0.0623 -0.0587 0.0312 -0.2690 -0.731 0.283 0.0364
4 20 STANDING 0.276 -0.01700 -0.1110 -0.9980 -0.9910 -0.998 -0.998 -0.9890 ... 0.6670 -0.9420 -0.9660 0.2450 0.1030 0.0661 -0.4120 -0.761 0.263 0.0296
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
3604 10277 WALKING_UPSTAIRS 0.357 -0.04460 -0.1300 -0.3140 -0.0556 -0.173 -0.386 -0.0575 ... 0.0168 -0.1630 -0.5930 -0.7110 -0.0612 -0.7060 0.0646 -0.660 0.274 0.1760
3605 10278 WALKING_UPSTAIRS 0.344 0.00479 -0.1220 -0.3200 -0.0667 -0.182 -0.380 -0.0710 ... -0.0292 0.1810 -0.2500 -0.4030 -0.7060 0.7390 0.8710 -0.653 0.278 0.1800
3606 10279 WALKING_UPSTAIRS 0.284 -0.00796 -0.1190 -0.3090 -0.0804 -0.211 -0.369 -0.0971 ... -0.1100 0.0245 -0.3930 -0.0761 -0.2390 0.9600 0.0866 -0.657 0.272 0.1830
3607 10280 WALKING_UPSTAIRS 0.207 0.02460 -0.1040 -0.3650 -0.1690 -0.216 -0.449 -0.1860 ... -0.2140 -0.3520 -0.7340 0.5350 -0.2570 0.9270 -0.0843 -0.657 0.267 0.1880
3608 10281 WALKING_DOWNSTAIRS 0.393 -0.01780 -0.0902 -0.0963 -0.1740 -0.257 -0.153 -0.2080 ... 0.0894 0.2740 -0.0368 -0.7430 -0.0802 0.9270 -0.6520 -0.807 0.190 0.1180

3609 rows × 563 columns

activity tBodyAcc.mean.X tBodyAcc.mean.Y tBodyAcc.mean.Z tBodyAcc.std.X tBodyAcc.std.Y tBodyAcc.std.Z tBodyAcc.mad.X tBodyAcc.mad.Y tBodyAcc.mad.Z ... fBodyBodyGyroJerkMag.meanFreq fBodyBodyGyroJerkMag.skewness fBodyBodyGyroJerkMag.kurtosis angle.tBodyAccMean.gravity angle.tBodyAccJerkMean.gravityMean angle.tBodyGyroMean.gravityMean angle.tBodyGyroJerkMean.gravityMean angle.X.gravityMean angle.Y.gravityMean angle.Z.gravityMean
0 STANDING 0.279 -0.01960 -0.1100 -0.9970 -0.9670 -0.983 -0.997 -0.9660 -0.983 ... 0.1460 -0.2170 -0.5640 -0.2130 -0.2310 0.0146 -0.1900 -0.852 0.182 -0.0430
1 STANDING 0.277 -0.01270 -0.1030 -0.9950 -0.9730 -0.985 -0.996 -0.9740 -0.985 ... 0.1210 0.3490 0.0577 0.0807 0.5960 -0.4760 0.1160 -0.852 0.188 -0.0347
2 STANDING 0.277 -0.01470 -0.1070 -0.9990 -0.9910 -0.993 -0.999 -0.9910 -0.992 ... 0.7400 -0.5640 -0.7660 0.1060 -0.0903 -0.1320 0.4990 -0.850 0.189 -0.0351
3 STANDING 0.298 0.02710 -0.0617 -0.9890 -0.8170 -0.902 -0.989 -0.7940 -0.888 ... 0.1310 0.2080 -0.0681 0.0623 -0.0587 0.0312 -0.2690 -0.731 0.283 0.0364
4 STANDING 0.276 -0.01700 -0.1110 -0.9980 -0.9910 -0.998 -0.998 -0.9890 -0.997 ... 0.6670 -0.9420 -0.9660 0.2450 0.1030 0.0661 -0.4120 -0.761 0.263 0.0296
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
3604 WALKING_UPSTAIRS 0.357 -0.04460 -0.1300 -0.3140 -0.0556 -0.173 -0.386 -0.0575 -0.217 ... 0.0168 -0.1630 -0.5930 -0.7110 -0.0612 -0.7060 0.0646 -0.660 0.274 0.1760
3605 WALKING_UPSTAIRS 0.344 0.00479 -0.1220 -0.3200 -0.0667 -0.182 -0.380 -0.0710 -0.245 ... -0.0292 0.1810 -0.2500 -0.4030 -0.7060 0.7390 0.8710 -0.653 0.278 0.1800
3606 WALKING_UPSTAIRS 0.284 -0.00796 -0.1190 -0.3090 -0.0804 -0.211 -0.369 -0.0971 -0.301 ... -0.1100 0.0245 -0.3930 -0.0761 -0.2390 0.9600 0.0866 -0.657 0.272 0.1830
3607 WALKING_UPSTAIRS 0.207 0.02460 -0.1040 -0.3650 -0.1690 -0.216 -0.449 -0.1860 -0.326 ... -0.2140 -0.3520 -0.7340 0.5350 -0.2570 0.9270 -0.0843 -0.657 0.267 0.1880
3608 WALKING_DOWNSTAIRS 0.393 -0.01780 -0.0902 -0.0963 -0.1740 -0.257 -0.153 -0.2080 -0.265 ... 0.0894 0.2740 -0.0368 -0.7430 -0.0802 0.9270 -0.6520 -0.807 0.190 0.1180

3609 rows × 562 columns

rn열 삭제, test도 진행

tBodyAcc.mean.X tBodyAcc.mean.Y tBodyAcc.mean.Z tBodyAcc.std.X tBodyAcc.std.Y tBodyAcc.std.Z tBodyAcc.mad.X tBodyAcc.mad.Y tBodyAcc.mad.Z tBodyAcc.max.X ... fBodyBodyGyroJerkMag.meanFreq fBodyBodyGyroJerkMag.skewness fBodyBodyGyroJerkMag.kurtosis angle.tBodyAccMean.gravity angle.tBodyAccJerkMean.gravityMean angle.tBodyGyroMean.gravityMean angle.tBodyGyroJerkMean.gravityMean angle.X.gravityMean angle.Y.gravityMean angle.Z.gravityMean
0 0.280 -0.01950 -0.1130 -0.9950 -0.9670 -0.979 -0.997 -0.9640 -0.977 -0.9390 ... 0.4150 -0.391 -0.760 -0.11900 0.1780 0.101 0.809 -0.849 0.181 -0.0491
1 0.277 -0.01660 -0.1150 -0.9980 -0.9810 -0.990 -0.998 -0.9800 -0.990 -0.9420 ... 0.0878 -0.351 -0.699 0.12300 0.1230 0.694 -0.616 -0.848 0.185 -0.0439
2 0.277 -0.02180 -0.1210 -0.9970 -0.9610 -0.984 -0.998 -0.9570 -0.984 -0.9410 ... 0.3140 -0.269 -0.573 0.01300 0.0809 -0.234 0.118 -0.848 0.189 -0.0374
3 0.279 -0.01480 -0.1170 -0.9970 -0.9820 -0.983 -0.997 -0.9820 -0.981 -0.9420 ... 0.5610 -0.779 -0.940 -0.00145 -0.0481 -0.340 -0.229 -0.759 0.264 0.0270
4 0.279 -0.01450 -0.1070 -0.9980 -0.9860 -0.993 -0.998 -0.9850 -0.995 -0.9430 ... 0.6770 -0.715 -0.937 0.02570 0.0665 -0.226 -0.225 -0.762 0.262 0.0294
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1536 0.289 -0.02810 -0.0943 -0.0623 0.1140 -0.190 -0.114 0.0393 -0.207 0.3300 ... 0.2860 -0.237 -0.607 -0.19600 0.6980 0.990 -0.108 -0.806 0.190 0.1200
1537 0.377 -0.01810 -0.1100 -0.3140 -0.1520 -0.214 -0.394 -0.1810 -0.266 -0.0726 ... -0.1910 -0.323 -0.753 -0.82900 0.0483 0.913 -0.904 -0.695 0.246 0.1730
1538 0.253 -0.02490 -0.1700 -0.3080 -0.1890 -0.141 -0.377 -0.2260 -0.221 0.0920 ... -0.1780 -0.142 -0.564 0.00451 0.3570 -0.946 0.614 -0.695 0.259 0.1580
1539 0.277 0.00108 -0.0740 -0.0685 -0.2450 -0.145 -0.149 -0.3030 -0.199 0.4030 ... -0.1040 0.161 -0.126 0.13400 0.8830 -0.994 0.475 -0.804 0.197 0.1140
1540 0.192 -0.03360 -0.1060 -0.3550 -0.0925 -0.313 -0.434 -0.0887 -0.336 -0.0416 ... 0.1590 -0.630 -0.916 0.53600 0.6890 -0.937 0.562 -0.647 0.282 0.1810

1541 rows × 561 columns

8. “activity” 컬럼에 대하여 인코딩 하기

  • 문자열로 구분하는데 여러모로 비용 및 한계가 있기에 이와 같이 숫자 구분으로 인코딩 필수

  • 0: …, 1:… 등으로 인코딩됨

array(['STANDING', 'SITTING', 'LAYING', 'WALKING', 'WALKING_DOWNSTAIRS',
       'WALKING_UPSTAIRS'], dtype=object)

위 unique 라벨을 바탕으로 라벨링 진행

LAYING                681
STANDING              668
SITTING               623
WALKING               603
WALKING_UPSTAIRS      541
WALKING_DOWNSTAIRS    493
Name: activity, dtype: int64
1    681
2    668
3    623
4    603
6    541
5    493
Name: activity, dtype: int64

9. df_train 으로 X = “특성 컬럼”, y = “activity” 만들기

  • 이제 훈련데이터의 X와 y로 구분

  • 전처리는 거의 완료 단계로..

  • 참고로 train데이터만 하는 이유는 test에 ‘activity’라벨이 없다.

  • 여기서 test는 고객에게 보여줄 훈련모델의 답지

# ......
print(X.columns)
print(y.name)
Index(['tBodyAcc.mean.X', 'tBodyAcc.mean.Y', 'tBodyAcc.mean.Z',
       'tBodyAcc.std.X', 'tBodyAcc.std.Y', 'tBodyAcc.std.Z', 'tBodyAcc.mad.X',
       'tBodyAcc.mad.Y', 'tBodyAcc.mad.Z', 'tBodyAcc.max.X',
       ...
       'fBodyBodyGyroJerkMag.meanFreq', 'fBodyBodyGyroJerkMag.skewness',
       'fBodyBodyGyroJerkMag.kurtosis', 'angle.tBodyAccMean.gravity',
       'angle.tBodyAccJerkMean.gravityMean', 'angle.tBodyGyroMean.gravityMean',
       'angle.tBodyGyroJerkMean.gravityMean', 'angle.X.gravityMean',
       'angle.Y.gravityMean', 'angle.Z.gravityMean'],
      dtype='object', length=561)
activity

10. X_train, X_test, y_train, y_test 만들기

  • 더 말할건 없을듯.
x_train values count: 2887
y_train values count: 2887
x_test values count: 722
y_test values count: 722

11. X_train, X_test 정규화 하기(옵션)

  • 여기서 정규화와 안 된 데이터하고 비교가 중요

  • 두 그룹을 만들필요가 있음

# train을 test 정규화 데이터 확인.

X_train_stand.head(5)
0 1 2 3 4 5 6 7 8 9 ... 551 552 553 554 555 556 557 558 559 560
0 1.263369 0.041429 -0.473708 0.558023 0.688464 0.823657 0.505502 0.752587 0.822891 1.082366 ... -0.288262 0.264987 0.073328 -2.304810 1.330785 -1.136089 1.079116 -0.403241 0.550853 0.852714
1 -0.793488 -1.771799 -5.097944 1.087796 0.344323 1.580836 1.094525 0.378718 1.626735 1.152838 ... 0.133866 -0.377673 -0.526774 -0.150440 0.106660 1.485142 -1.543728 -0.498093 0.608812 0.544066
2 0.179134 0.148650 0.266953 0.364758 0.579055 0.753710 0.322035 0.522514 0.979664 0.535279 ... -0.764047 0.522051 0.486301 -0.659841 -1.414478 -1.321346 -0.859596 -0.452643 0.518654 -0.298958
3 0.179134 0.003306 0.016147 -0.883506 -0.976539 -0.945008 -0.877738 -0.979125 -0.954719 -0.874164 ... 1.584276 -0.587714 -0.449341 -0.224884 1.646946 -0.489313 -1.411773 1.902853 -1.706329 -1.846038
4 -1.064547 0.352131 0.678432 0.908173 0.764055 1.003522 0.879676 0.880360 1.101037 0.798066 ... -0.661344 0.076891 0.028159 1.519444 -2.164805 1.444516 -0.934708 -0.221441 0.876068 -0.229858

5 rows × 561 columns

X_test_stand.head(5)
0 1 2 3 4 5 6 7 8 9 ... 551 552 553 554 555 556 557 558 559 560
0 1.096096 -0.393721 -0.331865 0.810934 1.437674 0.840067 0.833843 1.473250 0.918939 0.674501 ... 0.483094 0.204334 -0.009696 -2.194124 -1.329660 0.973570 0.488045 -0.406303 0.782000 0.577781
1 2.784875 0.529633 0.675178 0.728368 1.359141 2.711874 0.660003 1.607020 2.751704 0.586195 ... 0.454734 -1.060738 -0.790499 -0.726376 0.817020 -1.071162 -1.914002 0.351198 0.861634 1.851792
2 0.946647 -0.037385 2.043828 2.269595 0.905257 2.037417 2.280880 0.900549 1.974245 2.078204 ... 0.527660 -0.338752 -0.428340 0.179548 0.879566 -1.663406 -0.887804 -0.358360 0.246859 1.158059
3 -0.039720 0.065061 -0.086245 -0.858729 -0.954582 -0.930698 -0.850695 -0.957595 -0.936767 -0.848784 ... 0.965214 -0.265276 -0.381824 -0.023318 0.256337 1.084409 -1.181595 2.103997 -2.865241 -0.301670
4 -0.144335 0.033882 0.036565 -0.826620 -0.932431 -0.900385 -0.818865 -0.934603 -0.911276 -0.821188 ... 0.082003 -0.635853 -0.621049 -0.437089 0.832657 -0.113546 -0.036226 1.762642 -1.126033 -2.292538

5 rows × 561 columns

셀 따로 나누어서 실행하는 이유는 다를바 없이 데이터 양, 평균, 분산 등 요약데이터를 특정 vscode등에서 쉽게 보기 위해서

X_train_stand.describe()
0 1 2 3 4 5 6 7 8 9 ... 551 552 553 554 555 556 557 558 559 560
count 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 ... 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03 2.887000e+03
mean 6.472904e-16 2.092003e-17 1.052155e-16 -1.230590e-17 6.214480e-17 -3.568711e-17 1.421332e-16 -4.307065e-18 -6.399069e-17 -4.060947e-17 ... -7.629659e-17 1.107531e-16 -1.267508e-16 1.230590e-17 1.476708e-17 4.430124e-17 2.707298e-17 -6.276010e-17 2.707298e-17 -2.461180e-18
std 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 ... 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00 1.000173e+00
min -1.268818e+01 -2.342331e+01 -1.599233e+01 -8.971479e-01 -9.884742e-01 -9.699890e-01 -8.898078e-01 -9.893966e-01 -9.774766e-01 -9.928536e-01 ... -3.840090e+00 -2.105018e+00 -1.223666e+00 -2.935182e+00 -2.249412e+00 -1.656110e+00 -1.996432e+00 -9.822346e-01 -3.419341e+00 -3.542835e+00
25% -2.194815e-01 -1.920751e-01 -2.581717e-01 -8.812320e-01 -9.427214e-01 -9.175286e-01 -8.729096e-01 -9.442036e-01 -9.218473e-01 -8.741636e-01 ... -6.053818e-01 -7.334877e-01 -7.074494e-01 -3.806759e-01 -6.496783e-01 -8.419520e-01 -7.946339e-01 -6.225867e-01 -2.204204e-01 -2.912801e-01
50% 3.563251e-02 -3.842552e-03 1.614739e-02 -7.448097e-01 -5.985811e-01 -5.328190e-01 -7.473800e-01 -5.929309e-01 -5.223275e-01 -7.499101e-01 ... 8.108146e-03 -1.237443e-01 -2.815708e-01 -1.942674e-03 -8.790719e-04 -1.121840e-02 -6.359789e-03 -4.230018e-01 3.866361e-01 1.540716e-01
75% 1.950787e-01 1.438843e-01 2.277649e-01 7.990354e-01 8.981308e-01 8.174120e-01 7.963921e-01 8.996701e-01 8.228907e-01 8.100282e-01 ... 6.767221e-01 5.784795e-01 3.959634e-01 4.087895e-01 6.561582e-01 8.668047e-01 7.827263e-01 -5.643759e-02 6.120323e-01 5.878297e-01
max 6.668596e+00 2.423050e+01 9.068676e+00 3.650260e+00 2.948252e+00 4.026240e+00 3.938252e+00 3.092351e+00 4.079735e+00 2.716207e+00 ... 2.892161e+00 4.033170e+00 5.074175e+00 2.855232e+00 2.190210e+00 1.590771e+00 2.041366e+00 2.922514e+00 3.020552e+00 4.012135e+00

8 rows × 561 columns

X_test_stand.describe()
0 1 2 3 4 5 6 7 8 9 ... 551 552 553 554 555 556 557 558 559 560
count 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 ... 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02 7.220000e+02
mean -3.395253e-16 3.444459e-17 -6.642886e-17 -1.107148e-16 -1.230164e-17 1.230164e-18 1.230164e-18 -6.150820e-17 -1.955961e-16 3.567476e-17 ... 4.920656e-17 2.829377e-17 1.045639e-16 -1.968262e-17 3.690492e-17 1.968262e-17 -4.920656e-18 3.567476e-17 -3.321443e-17 5.166689e-17
std 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 ... 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00 1.000693e+00
min -1.105415e+01 -1.480303e+01 -4.384599e+00 -8.679028e-01 -9.545815e-01 -9.433283e-01 -8.604884e-01 -9.575946e-01 -9.495121e-01 -8.763795e-01 ... -3.633154e+00 -1.936066e+00 -1.185885e+00 -2.903637e+00 -2.156165e+00 -1.762665e+00 -2.011242e+00 -1.000798e+00 -3.215631e+00 -3.282552e+00
25% -9.949983e-02 -1.459564e-01 -1.817641e-01 -8.518483e-01 -9.082668e-01 -8.902811e-01 -8.457977e-01 -9.095212e-01 -8.959821e-01 -8.432647e-01 ... -6.022825e-01 -7.149198e-01 -7.007901e-01 -3.670513e-01 -6.500268e-01 -7.398856e-01 -7.590126e-01 -6.474570e-01 -2.885209e-01 -1.860478e-01
50% 4.994966e-02 3.388159e-02 -3.166282e-02 -7.635488e-01 -6.615906e-01 -6.086260e-01 -7.564290e-01 -6.555679e-01 -6.002927e-01 -7.623172e-01 ... 2.933475e-02 -1.454774e-01 -2.721791e-01 3.052797e-03 -2.750294e-03 6.121582e-02 1.014709e-03 -4.523286e-01 4.172759e-01 2.232202e-01
75% 2.143441e-01 1.714048e-01 1.344720e-01 8.361623e-01 9.379789e-01 8.653272e-01 8.179281e-01 9.276163e-01 8.571248e-01 8.882667e-01 ... 6.279329e-01 5.485556e-01 3.915034e-01 3.736745e-01 7.092394e-01 8.135150e-01 7.833866e-01 2.662289e-02 6.346770e-01 5.934982e-01
max 4.040251e+00 8.737372e+00 1.510127e+01 2.709946e+00 2.670049e+00 3.325705e+00 2.861164e+00 2.664636e+00 3.072884e+00 2.127877e+00 ... 3.027390e+00 3.549110e+00 4.522284e+00 2.979537e+00 2.161767e+00 1.537691e+00 2.006651e+00 2.671643e+00 2.756925e+00 3.701746e+00

8 rows × 561 columns

요약도 마찬가지..

12. AI Model : 분류

  • 드디어 위 문제에 관해서 분류 모델링 선택해 진행한다.

  • 훈련등은 다음 프로세스에..

  • 아래 코드는 f1_score micro형식만 추출해 구분목적으로 코드 작성.

  • KNN모델을 예로 첫번째로 진행.

KNeighborsClassifier()

13. AI모델에서의 .fit // .predict // score (정확도, 정밀도, 재현율, F1 Score)

  • 드디어 훈련, 평가, 성능확인 등 진행해본다.

  • 일단 대표로 KNN.. 과연….

  • 정규화로 진행은 일단 한번 진행하고 나서…

  • 훈련 후 평가출력결과는 아래에 표기

precision recall f1-score support
STANDING 1.000000 0.993333 0.996656 150.000000
SITTING 0.872611 0.907285 0.889610 151.000000
LAYING 0.864078 0.809091 0.835681 110.000000
WALKING 0.930693 1.000000 0.964103 94.000000
WALKING_DOWNSTAIRS 0.990291 0.944444 0.966825 108.000000
WALKING_UPSTAIRS 0.990826 0.990826 0.990826 109.000000
accuracy 0.940443 0.940443 0.940443 0.940443
macro avg 0.941417 0.940830 0.940617 722.000000
weighted avg 0.940789 0.940443 0.940162 722.000000

KNN 분류 결과로…

  • STANDING 이 perfect인건 박수칠 만함…

  • f1-score 최저값은 LAYING 84%

  • 평균은 94%…..

  • 다른모델도 이와같이 12, 13 프로세스 반복해 나가면서 진행.

  • KNN 그 외 옵션등으로 성능향상 부분은 나중에..

re12, 13. 다음은 의사결정트리

  • 의사결정트리로 결과내보기.

  • KNN등 다른 모델들과 비교해보면서…

  • 성능향상은 다른 모델들 해보고 나서..

# f1-score등 성능확인
dt_res = classification_report(y_test, y_predict, ...)

# ......

df_dt_res
precision recall f1-score support
STANDING 1.000000 1.000000 1.000000 150.000000
SITTING 0.930556 0.887417 0.908475 151.000000
LAYING 0.854701 0.909091 0.881057 110.000000
WALKING 0.882353 0.957447 0.918367 94.000000
WALKING_DOWNSTAIRS 0.923810 0.898148 0.910798 108.000000
WALKING_UPSTAIRS 0.923077 0.880734 0.901408 109.000000
accuracy 0.923823 0.923823 0.923823 0.923823
macro avg 0.919083 0.922140 0.920018 722.000000
weighted avg 0.925012 0.923823 0.923881 722.000000

결정트리 분류 결과로…

  • STANDING 이 perfect라 박수칠 만함…

  • f1-score 최저값은 LAYING 86.7..% KNN보다 괜찮은데?

  • 평균은 92% KNN보다는… 아마도 전체적으로 낮아서…

  • 그래도 KNN보다 좋아보이는건 사실

  • 다른모델도 이와같이 12, 13 프로세스 반복해 나가면서 진행.

  • dt 그 외 옵션등으로 성능향상 부분은 나중에..

  • …. 다음은 선형회귀를 할까 했는데 분류가 아닌 예측에 최적이라..

  • 로지스틱 회귀로..

re12, 13. 다음은 로지스틱회귀

  • 로지스틱회귀로 결과내보기.

  • KNN등 다른 모델들과 비교해보면서…

  • 성능향상은 다른 모델들 해보고 나서..

# f1-score등 성능확인
lg_res = classification_report(y_test, y_predict, ... )

# ......

print(df_lg_res)
                    precision    recall  f1-score     support
STANDING             1.000000  1.000000  1.000000  150.000000
SITTING              0.959184  0.933775  0.946309  151.000000
LAYING               0.911504  0.936364  0.923767  110.000000
WALKING              0.989362  0.989362  0.989362   94.000000
WALKING_DOWNSTAIRS   0.990741  0.990741  0.990741  108.000000
WALKING_UPSTAIRS     0.990909  1.000000  0.995434  109.000000
accuracy             0.973684  0.973684  0.973684    0.973684
macro avg            0.973617  0.975040  0.974269  722.000000
weighted avg         0.973838  0.973684  0.973697  722.000000

로지스틱회귀 분류 결과로…

  • STANDING 이 perfect라 박수칠 만함.

  • f1-score 최저값은 LAYING 92.3% …

  • 평균은 97% 로지스틱회귀 역대급.. 이었다가 SVM에 밀림. 그래도 역시 이진분류다운…

  • 다른모델도 이와같이 12, 13 프로세스 반복해 나가면서 진행.

  • lg 그 외 옵션등으로 성능향상 부분은 나중에..

re12, 13. 다음은 랜덤포레스트

  • 랜덤포레스트로 결과내보기.

  • KNN등 다른 모델들과 비교해보면서…

  • 성능향상은 다른 모델들 해보고 나서..

# f1-score등 성능확인
rfc_res = classification_report(y_test, y_predict, ... )

# ......

df_rfc_res = pd.DataFrame(rfc_res).T
df_rfc_res
precision recall f1-score support
STANDING 1.000000 0.993333 0.996656 150.000000
SITTING 0.945946 0.927152 0.936455 151.000000
LAYING 0.902655 0.927273 0.914798 110.000000
WALKING 0.958763 0.989362 0.973822 94.000000
WALKING_DOWNSTAIRS 0.962264 0.944444 0.953271 108.000000
WALKING_UPSTAIRS 0.954128 0.954128 0.954128 109.000000
accuracy 0.955679 0.955679 0.955679 0.955679
macro avg 0.953959 0.955949 0.954855 722.000000
weighted avg 0.955925 0.955679 0.955711 722.000000

랜덤포레스트 분류 결과로…

  • 원래 n_estimators 기본값은 100 이 중 10이하로 낮은 수치로 사용시 성능이 잘 안나옴.

그렇기에 평균 92%등 낮게 나오게 됨.

  • 반면.. 10 이상 예로 15수치정도로 들어갔음, 성적표는 아래와 같음

  • STANDING 이 perfect가 아닌.. 99.6%

  • f1-score 최저값은 LAYING 92.0% …

  • 평균은 95.1% .. 의사결정, KNN보단 높게 나옴

  • 근데 랜덤포레스트의 경우 좀 더 옵션을 여러개 붙이면 어쩌면…

실제 다른 분들이 했을 때, 역대 성적이 나온것도 랜덤포레스트 였음.

  • 트리모델의 경우 데이터양이 2800정도로는 활약하기 힘든부분도..

그렇다고 많으면 그 만큼 더 걸리기도함.

  • 다른모델도 이와같이 12, 13 프로세스 반복해 나가면서 진행.

  • lg 그 외 옵션등으로 성능향상 부분은 나중에..

re12, 13. 다음은 SVM(서포트 벡터 머신)

  • 서포트 벡터 머신으로 결과내보기.

  • KNN등 다른 모델들과 비교해보면서…

  • 성능향상은 다른 모델들 해보고 나서..

# f1-score등 성능확인
svm_res = classification_report(y_test, y_predict, ...)

# ......

df_svm_res = pd.DataFrame(svm_res).T
df_svm_res
precision recall f1-score support
STANDING 1.000000 1.000000 1.000000 150.000000
SITTING 0.953642 0.953642 0.953642 151.000000
LAYING 0.936364 0.936364 0.936364 110.000000
WALKING 0.989362 0.989362 0.989362 94.000000
WALKING_DOWNSTAIRS 1.000000 0.990741 0.995349 108.000000
WALKING_UPSTAIRS 0.990909 1.000000 0.995434 109.000000
accuracy 0.977839 0.977839 0.977839 0.977839
macro avg 0.978379 0.978351 0.978358 722.000000
weighted avg 0.977852 0.977839 0.977839 722.000000

SVM 분류 결과로…

  • STANDING 이 perfect라 박수칠 만함…

  • f1-score 최저값은 LAYING 93.6% …

  • 평균은 97.7% 로지스틱회귀 97.3% 에 비해 좀 더 높은 역대급.. 왜 SVM이 잘쓰였는지.

  • 기본옵션일 뿐인데..

  • 다른모델도 이와같이 12, 13 프로세스 반복해 나가면서 진행.

  • lg 그 외 옵션등으로 성능향상 부분은 나중에..

re12, 13. 다음은 나이브 베이지안

  • 덤으로 한다는 느낌… 나이브 베이지안으로 결과내보기.

  • 나이브 베이즈도 여러 종류모델이 있는데 이 중 가우시안만..

  • 가우시안을 택한 이유는 데이터를 기반으로 해야할 행동 분류라면 이 모델이 나아보이며 예시도 있기에

  • 다만.. 나이브베이지안 하는 것들을 보니 주의할 점. 라벨들이 독립적이어야 한다.

  • 데이터를 보아하니 라벨은 하나뿐이겠다. (실은 여러개 있어야..) 일단 해보는건 어떨까 해서…

  • KNN등 다른 모델들과 비교해보면서…

  • 성능향상은 다른 모델들 해보고 나서..

# f1-score등 성능확인
gnb_res = classification_report(y_test, y_predict, ...)

# ......

print(df_gnb_res)
                    precision    recall  f1-score     support
STANDING             1.000000  0.973333  0.986486  150.000000
SITTING              0.880000  0.582781  0.701195  151.000000
LAYING               0.605096  0.863636  0.711610  110.000000
WALKING              0.884615  0.734043  0.802326   94.000000
WALKING_DOWNSTAIRS   0.816327  0.740741  0.776699  108.000000
WALKING_UPSTAIRS     0.720280  0.944954  0.817460  109.000000
accuracy             0.804709  0.804709  0.804709    0.804709
macro avg            0.817720  0.806581  0.799296  722.000000
weighted avg         0.830011  0.804709  0.804066  722.000000

나이브 베이지안 분류 결과로…

  • f1-score 최저값은 SITTING 70%정도..

  • 평균은 80.5%정도.. 이 데이터에서는 이 모델 대충옵션을 넣은 것으로 쓰이기엔 애매한 것이구나라고..

  • 다른모델도 이와같이 12, 13 프로세스 반복해 나가면서 진행.

  • lg 그 외 옵션등으로 성능향상 부분은 나중에..

re12, 13. 다음은 XgBoost

  • XgBoost으로 결과내보기. 카글에 은근 쓰이는 모델

  • 다만.. 얘가 분류전문인지….

  • KNN등 다른 모델들과 비교해보면서…

  • 성능향상은 다른 모델들 해보고 나서..

# f1-score등 성능확인
xgb_res = classification_report(y_test, y_predict + 1, ...)

# ......

df_xgb_res
precision recall f1-score support
STANDING 1.000000 1.000000 1.000000 150.000000
SITTING 0.959732 0.947020 0.953333 151.000000
LAYING 0.928571 0.945455 0.936937 110.000000
WALKING 0.989247 0.978723 0.983957 94.000000
WALKING_DOWNSTAIRS 0.963303 0.972222 0.967742 108.000000
WALKING_UPSTAIRS 0.972477 0.972477 0.972477 109.000000
accuracy 0.969529 0.969529 0.969529 0.969529
macro avg 0.968888 0.969316 0.969074 722.000000
weighted avg 0.969651 0.969529 0.969563 722.000000

XGBoost 분류 결과로…

  • XGBoost 답게, 넘사벽의 로지스틱과 SVM만큼은 아니더라도 대충넣은 옵으로 96.9프로 정도

  • 다른모델과 다른점은 이 인코딩 라벨을 0부터 시작하지 않으면 삑삑 거림..

그래서.. y_train - 1, y_predict + 1 이유는 이래서 있는거..

  • f1-score 최저값은 LAYING 93.6%정도.

  • 평균은 96.9%정도.. XGBoost 모델은 AI모델에서 은근 고급?으로 생각하고 있었는데.. 역시나.

  • XGBoost 방식이 랜덤포레스트와 달리 boost 앙상블 같은 다른 방식으로 해결하려하는 모델.

비슷하거나 경우에 따라선 좋은 결과를 나올 수도 있음

  • 다른모델도 이와같이 12, 13 프로세스 반복해 나가면서 진행.

  • lg 그 외 옵션등으로 성능향상 부분은 나중에..

정규화 데이터로…
  • 이때까지는 정규화 없이 진행 정규화 이후로 어떠한 데이터가 나올지 확인해보자.

  • 원래 NN까지 할려고 했는데 생각할게 많아서.. 이 부분은 캡스톤 외에..

아니면 끝나고도 추후 2-3차적으로 올릴때 보안하는 쪽으로..

models = [
   ...
]
resout1 = []

for model in models:
  #......
  resout1.append(df_outres.copy())
  
  
# ......

# f1-score등 성능확인
out_restxt = classification_report(y_test, y_predict + 1, ...)

# ......
resout1.append(df_outres.copy())

14. df_test 에 대한 분류 하여 “activity” 컬럼 작성하여 test_result.csv 파일 만들기

  • ‘df_test’의 경우 정답 없는 문제지라 AI에게 테스트로 predict로 던져보는…

  • 디코딩해서 만든게 test_result.csv>

  • 즉 성능 보고가 아닌.. df_test의 답지를 만들라는거.. 각 모델에 따라..

  • 먼저 성능 보고 하고 답지만들고, 답지 출력

94.0443
# 각 성능지표데이터에 index name 붙이기
resout_name = [
  "knn algorithm",
  "dTree algorithm",
  ......
  "GNB algorithm_norm",
  "XGB algorithm_norm",
]

......
  
pmf1s

# 아래와 같이 성적표 정리를 해둠.
# 참고 및 모델선택은 추후 아래에..
models micro f1s
0 knn algorithm 94.0443
1 dTree algorithm 92.3823
2 LogisR algorithm 97.3684
3 RFC algorithm 95.5679
4 SVM algorithm 97.7839
5 GNB algorithm 80.4709
6 XGB algorithm 96.9529
7 knn algorithm_norm 93.6288
8 dTree algorithm_norm 90.8587
9 LogisR algorithm_norm 97.6454
10 RFC algorithm_norm 92.5208
11 SVM algorithm_norm 97.3684
12 GNB algorithm_norm 75.6233
13 XGB algorithm_norm 95.0139
  • 다음 위 모델 가지고 result_test.csv 출력

  • X_test 지정

  • 한꺼번에 처리

knn algorithm dTree algorithm LogisR algorithm RFC algorithm SVM algorithm GNB algorithm XGB algorithm knn algorithm_norm dTree algorithm_norm LogisR algorithm_norm RFC algorithm_norm SVM algorithm_norm GNB algorithm_norm XGB algorithm_norm
0 2 2 2 2 2 2 2 2 2 2 2 2 2 2
1 2 2 2 2 2 3 2 2 2 2 2 2 2 2
2 2 2 2 2 2 3 2 2 2 2 2 2 2 2
3 2 2 2 2 2 2 2 3 2 2 2 2 2 2
4 2 3 2 2 2 3 2 2 2 2 2 2 2 2
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1536 5 5 5 5 5 5 5 5 5 5 5 5 5 5
1537 6 6 6 6 6 6 6 6 6 6 6 6 6 6
1538 6 6 6 6 6 6 6 6 6 6 6 6 6 6
1539 5 5 5 5 5 4 5 5 5 5 5 5 4 5
1540 6 4 6 6 6 6 6 6 4 6 6 6 6 6

1541 rows × 14 columns

  • 디코딩으로 마무리
knn algorithm dTree algorithm LogisR algorithm RFC algorithm SVM algorithm GNB algorithm XGB algorithm knn algorithm_norm dTree algorithm_norm LogisR algorithm_norm RFC algorithm_norm SVM algorithm_norm GNB algorithm_norm XGB algorithm_norm
0 STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING
1 STANDING STANDING STANDING STANDING STANDING SITTING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING
2 STANDING STANDING STANDING STANDING STANDING SITTING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING
3 STANDING STANDING STANDING STANDING STANDING STANDING STANDING SITTING STANDING STANDING STANDING STANDING STANDING STANDING
4 STANDING SITTING STANDING STANDING STANDING SITTING STANDING STANDING STANDING STANDING STANDING STANDING STANDING STANDING
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1536 WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS
1537 WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS
1538 WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS
1539 WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING_DOWNSTAIRS WALKING WALKING_DOWNSTAIRS
1540 WALKING_UPSTAIRS WALKING WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS WALKING_UPSTAIRS

1541 rows × 14 columns

여기까지 정리 및 보고

  • 위 각 모델 정리된 pandas데이터를 csv로…

  • 지금 기록된 csv와 여기 현재까지 해둔 jupyter로 제출

  • 다만 위와 같이 한건 그 당시 전체 출력하면 되겠다는 학구열의 오류.

  • 진짜 결론은 아래를 참조

결론!
  • 여기서 제일 좋은 모델로 제일 좋은 예측한 답안지를 제출해야함

  • 그러면 그래프를 그려본다. 성능 지수는 평균 f1기준..

  • 여기까지 기록만 본다면 SVM이 기준.

  • 위 svm f1 성능 기록 : 97.78% (아래 지표 및 선택한 근거를 참조)

  • SVM기준의 답지등으로 기존 test.csv를 activate에 합쳐서 제출하도록 합시다.

  • 아래 데이터는 어느 데이터가 f1s micro 기준으로 제일 나은지를 보여주는 지표

models micro f1s
0 knn algorithm 94.0443
1 dTree algorithm 92.3823
2 LogisR algorithm 97.3684
3 RFC algorithm 95.5679
4 SVM algorithm 97.7839
5 GNB algorithm 80.4709
6 XGB algorithm 96.9529
7 knn algorithm_norm 93.6288
8 dTree algorithm_norm 90.8587
9 LogisR algorithm_norm 97.6454
10 RFC algorithm_norm 92.5208
11 SVM algorithm_norm 97.3684
12 GNB algorithm_norm 75.6233
13 XGB algorithm_norm 95.0139
97.7839
  • 위와 같이 최대값을 출력할 때, 97.7839%의 SVM 알고리즘이 최고의 성적표를 제출.

  • 정규화했을경우 오히려 살짝 성능 저하를 보여줌

  • 위 데이터만의 결론으로 SVM으로 진행.

0                 STANDING
1                 STANDING
2                 STANDING
3                 STANDING
4                 STANDING
               ...        
1536    WALKING_DOWNSTAIRS
1537      WALKING_UPSTAIRS
1538      WALKING_UPSTAIRS
1539    WALKING_DOWNSTAIRS
1540      WALKING_UPSTAIRS
Name: activity, Length: 1541, dtype: object
from sklearn import svm # support vector machine
# 모델 생성
svm = svm.SVC(kernel = 'linear', ...)

# ......

print(df_svm_res)
                    precision    recall  f1-score     support
STANDING             1.000000  0.993333  0.996656  150.000000
SITTING              0.948052  0.966887  0.957377  151.000000
LAYING               0.953271  0.927273  0.940092  110.000000
WALKING              1.000000  1.000000  1.000000   94.000000
WALKING_DOWNSTAIRS   0.990826  1.000000  0.995392  108.000000
WALKING_UPSTAIRS     1.000000  1.000000  1.000000  109.000000
accuracy             0.980609  0.980609  0.980609    0.980609
macro avg            0.982025  0.981249  0.981586  722.000000
weighted avg         0.980644  0.980609  0.980574  722.000000
  • 여기서 98프로 성능으로 나오는건 그외 C, degree등 추가 옵션으로 더 나은 성능으로 데이터를 뽑아낸 것
  • 이후 test예시 데이터와 답지를 합쳐서 제출.
....to_csv('./test_result.csv')

그외 참조 사이트

  • matlip chart 등 확인

https://pythonspot.com/matplotlib-bar-chart/

  • pandas drop확인

https://fhaktj8-18.tistory.com/entry/drop-%ED%95%A8%EC%88%98-%ED%99%9C%EC%9A%A9%ED%95%B4%EC%84%9C-%ED%96%89-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0

  • 정규화 StandardScaler 기능 및 확인

https://jimmy-ai.tistory.com/139

마무리

  • 분류모델에 쓰인 온갖 전처리부터, 모델까지 정리하는 유익한 시간.
  • 앞에서도 언급했으나 여러모델들을 테스트해서 출력해보는 학구열은 좋았으나 여기서 목적은..
  • 고객에게 예시와 함께 판별가능한 모델과 동시에 솔루션을 제공하는게 목적.
  • 풀어낸 csv 그리고 성능지표등을 보여주기만 하면 됬었을..
  • 사족이 많고 신경망도 추후 개선할 예정이지만 그래도 캡스톤을 완수한 평가는 있음.

댓글남기기