{
  "fetched_at": "2026-10-24T16:24:34Z",
  "source_url": "https://www.kaggle.com/competitions/2024-ml-w12p1/data",
  "pages": [
    {
      "name": "data-description",
      "content": "##**데이터 셋 소스**##\n- UCI HAR 데이터 셋, [DB Web](https://archive.ics.uci.edu/ml/datasets/human+activity+recognition+using+smartphones)\n- Human Activity Recognition on Smartphones Using a Multiclass Hardware-Friendly Support Vector Machine, IWAAL 2012, [DB Paper](https://upcommons.upc.edu/bitstream/handle/2117/101769/IWAAL2012.pdf)\n\n##**데이터 설명 (RawData)**##\n- RawData captured at a frequency of 50Hz.\n- RawData/acc_expXX_userYY.txt\n   - The raw triaxial acceleration signal for the experiment number XX and associated with the user number YY. Every row is one acceleration sample (three-axis) captured at a frequency of 50Hz.\n- RawData/gyro_expXX_userYY.txt\n   - The raw triaxial angular speed signal for the experiment number XX and associated with the user number YY. Every row is one ang the user number YY. Every row is one angular velocity sample (three axes) captured at a frequency of 50Hz.\n- RawData/labels.txt\n   - It includes all the activity labels available for the dataset (1 per row).\n   - Column 1: experiment number ID\n   - Column 2: user number ID\n   - Column 3: activity number ID\n   - Column 4: Label start point (in number of signal log samples (recorded at 50Hz))\n   - Column 5: Label end point (in number of signal log samples)",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "rules",
      "content": "2024학년도 1학기 기계학습 실습문제 (12주차)",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "abstract",
      "content": "## **교과목 정보** ##\n- 세종대학교 AI로봇학과 기계학습 (최유경 교수)\n- 2024년 1학기 기계학습 12주차 실습\n\n\n## **실습 문제** ##\n- 센서데이터를 이용한 행동 분류하기\n- 실제 데이터를 사용하여 문제를 해결해보는 과정을 경험하는 문제입니다.\n- 데이터 가공단계를 [스캘레톤코드](https://www.kaggle.com/code/sjkimhyunwoo/2024-ml-w12p1-skeleton-code)로 제공하오니 잘 확인하시면서 천천히 해결해보세요.\n\n## **학습 목표** ##\n-1D 센서 데이터(자이로, 가속도)를 사용하여 사람의 행동유형을 분류할 수 있다.\n- 1D 센서 데이터를 Feature 로 기술할 수 있다.\n- 좋은 Feature를 만들수록 분류 성능이 향상됨을 알 수 있다.\n\n## **주의사항** ##\n- 성능 향상을 위해 인공신경망은 사용할 수 없다. 즉, 배운 범주내의 방법을 다양하게 활용해야함.\n## **문제 시작하기** ##\n- 1) 먼저 아래 실습문 메뉴얼을 읽습니다.\n- 2) 스켈레톤 코드 를 복사-편집하여 사용합니다.\n- 3) 스켈레톤 코드 내 메뉴얼을 참고하여 [스켈레톤 코드]의 [Empty Module]을 구현합니다.\n- 4) 결과 파일(csv)을 리더보드에 제출한다.\n- 5) 베이스라인을 넘지 못했다면, 실습문제 메뉴얼과 스켈레톤 코드의 주석을 천천히 다시 읽어가면서 디버깅 한다.\n\n##**개요**##\n 실습문제는 스마트폰에 장착된 자이로센서와 가속도 센서를 통해 사람의 행동을 예측하는 문제입니다.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8280884%2F2380e5e5b9a1c6d21a84dc85d049ec66%2Fimg1.png?generation=1678284731633674&alt=media)\n스마트폰은 다양한 센서로 이뤄져있으며, 대표적으로는 가속도 센서와 자이로 센서가 있습니다. 가속도 센서(Accelerometer)는 X,Y,Z 축에 대한 가속도를 측정하는 센서이며, 스마트폰의 움직임을 알 수 있습니다. 다음으로는 자이로 센서(Gyroscope)는 물체의 회전속도를 측정하는 센서이며, 스마트폰의 기울임을 알 수 있습니다. 이외에도 다양한 센서가 존재하지만 해당 실습문제에서는 이 두가지 센서를 활용하게 됩니다.\n\n##**데이터셋 설명**##\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8280884%2F527b13d7ca6d07c2fd057d2655403f85%2Fimg2.png?generation=1678284799220305&alt=media)\n\n해당 실습문제에서는 2012년 발표된 논문인 'Human Activity Recognition on Smartphones using a Multiclass Hardware-Friendly Support Vector Machine'에서 공개한 데이터셋을 이용해 사람의 활동을 분류할 예정입니다. 해당 데이터셋에서 사람의 활동은 총 6가지로 나타내고 있습니다. 6가지 활동으로는 '1 WALKING, 2 WALKING_UPSTAIRS, 3 WALKING_DOWNSTAIRS,4 SITTING, 5 STANDING, 6 LAYING' 이 있습니다. 다시 설명하면 해당 데이터셋은 6가지의 사람의 행동을 스마트폰의 가속도 센서와 자이로 센서로 측정된 데이터로 분류하는 것을 목적으로 만들어졌습니다.\n\nHAR 데이터셋 제작에는 총 30명의 피실험자가 참여하였으며, 데이터셋 제작에 사용된 휴대폰은 갤럭시 S2 입니다. 61번의 실험이 진행됐고, 피실험자는 앞서 언급한 6가지 동작을 스마트폰을 몸에 착용한 채로 수행하게 됩니다. 그리고 해당 데이터셋은 피실험자가 수행한 동작과 동작을 수행한 시작시간과 종료시간 등을 기록하였습니다. 센서 데이터는 50Hz를 주기로 수집됐습니다.\n\n이번 실습문제에서는 61번의 실험에서 스마트폰으로 측정된 자이로 센서와 가속도 센서의 Raw 데이터를 가공해 Feature를 추출하고, 해당 Feature를 기반으로 총 6가지 행동을 분류문제로 해결할 예정입니다. 실습문제에서는 Raw 데이터가 사용되기 때문에 실제 Raw데이터를 잘 가공해 Feature를 추출해야하는 것이 핵심입니다. 해당 논문과 데이터셋이 촬영된 비디오 링크를 아래 추가하였으니 참고하시길 바랍니다.\n\n[Video](https://www.youtube.com/watch?v=XOEN9W05_4A)\n\n[Paper](https://upcommons.upc.edu/bitstream/handle/2117/101769/IWAAL2012.pdf)\n\n##**데이터셋 불러오기**##\n해당 실습문제에서는 데이터셋 로더를 제공합니다. 데이터를 다운받으시면 data_loader.py를 확인하실 수 있습니다. 해당 파이썬 코드에 정의되어 있는 'import_raw_signals', 'import_labels_file' 함수를 통해서 Raw 데이터를 불러오시면 됩니다. 이때 캐글 노트북으로 진행하시는 분들은 경로 설정이 중요한데 다음과 같이 설정하시면 됩니다.\n\n```\nimport data_loader for data loading\nfrom data_loader import import_raw_signals, import_labels_file,normalize5,normalize2\n\nRaw_data_paths = sorted(glob(\"/kaggle/input/2020mltermprojecthar/RawData/*\"))\nRaw_acc_paths=Raw_data_paths[0:61]\nRaw_gyro_paths=Raw_data_paths[61:122]\n\nprint ((\"RawData folder contains in total {:d} file \").format(len(Raw_data_paths)))\nprint ((\"The first {:d} are Acceleration files:\").format(len(Raw_acc_paths)))\nprint ((\"The second {:d} are Gyroscope files:\").format(len(Raw_gyro_paths)))\nprint (\"The last file is a labels file\")\nprint (\"test labels file path is:\",Raw_data_paths[122])\nprint (\"train labels file path is:\",Raw_data_paths[123])\n\nraw_dic={}\nraw_acc_columns=['acc_X','acc_Y','acc_Z']\nraw_gyro_columns=['gyro_X','gyro_Y','gyro_Z']\nfor path_index in range(0,61):\n        key= Raw_data_paths[path_index][-16:-4]\n        raw_acc_data_frame=import_raw_signals(Raw_data_paths[path_index],raw_acc_columns)\n        raw_gyro_data_frame=import_raw_signals(Raw_data_paths[path_index+61],raw_gyro_columns)\n        raw_signals_data_frame=pd.concat([raw_acc_data_frame, raw_gyro_data_frame], axis=1)\n        raw_dic[key]=raw_signals_data_frame\n\nprint('raw_dic contains %d DataFrame' % len(raw_dic))\ndisplay(raw_dic['exp01_user01'].head(3))\n```\n\ntrain, test 라벨을 불러오기 위한 방법은 다음과 같습니다.\n```\ntrain_raw_labels_columns=['experiment_number_ID','user_number_ID','activity_number_ID','Label_start_point','Label_end_point']\ntest_raw_labels_columns=['experiment_number_ID','user_number_ID','Label_start_point','Label_end_point']\n\ntest_labels_path=Raw_data_paths[122]\ntrain_labels_path=Raw_data_paths[123]\n\ntrain_Labels_Data_Frame=import_labels_file(train_labels_path,train_raw_labels_columns)\ntest_Labels_Data_Frame=import_labels_file(test_labels_path,test_raw_labels_columns)\n\nprint (\"The first 3 rows of  train_Labels_Data_Frame:\" )\ndisplay(train_Labels_Data_Frame.head(3))\nprint(train_Labels_Data_Frame.shape)\ndisplay(test_Labels_Data_Frame.head(3))\nprint(test_Labels_Data_Frame.shape)\n```\n\n##**데이터 전처리**##\n해당 데이터셋을 제작한 저자는 논문을 통해 Raw 데이터 전처리 방법에 대해서 자세히 나타냈습니다. 먼저 RAW 데이터는 3축의 자이로 센서와 3축의 가속도계 센서를 통해 측정된 값들을 시간순서로 기록했습니다. 가장먼저 RAW 데이터에는 많은 노이즈가 있기 때문에 해당 노이즈에 대한 필터를 통해 처리를 진행해야 합니다. 논문에서 저자는 노이즈를 제거하기 위해 median filter와 3차 low pass Butterworth filter를 사용했다고 이야기합니다. 이때 Butter worth filter에 coner frequency는 20Hz로 설정했다고 합니다. 또한 가속도계 센서의 값을 body 가속도와 gravity 가속도 신호로 분리하였는데, 여기에도 Butter worth filter가 사용됐으며 이때 coner frequency는 0.3Hz로 설정했다고 합니다.\n\n####**Median Filter**####\n```\nfrom scipy.signal import medfilt\n\ndef median(signal):\n    array=np.array(signal)   \n    med_filtered=sp.signal.medfilt(array, kernel_size=3)\n    return  med_filtered\n```\n\n####**Butterworth Filter**####\n```\nfrom scipy.fftpack import fft  \nfrom scipy.fftpack import fftfreq\nfrom scipy.fftpack import ifft\nimport math \n\nsampling_freq = 50\nnyq=sampling_freq/float(2)\nfreq1 = 0.3\nfreq2 = 20\n\n# Function name: components_selection_one_signal\n\n# Inputs: t_signal:1D numpy array (time domain signal); \n\n# Outputs: (total_component,t_DC_component , t_body_component, t_noise) \n#           type(1D array,1D array, 1D array)\n\n# cases to discuss: if the t_signal is an acceleration signal then the t_DC_component is the gravity component [Grav_acc]\n#                   if the t_signal is a gyro signal then the t_DC_component is not useful\n# t_noise component is not useful\n# if the t_signal is an acceleration signal then the t_body_component is the body's acceleration component [Body_acc]\n# if the t_signal is a gyro signal then the t_body_component is the body's angular velocity component [Body_gyro]\n\ndef components_selection_one_signal(t_signal,freq1,freq2):\n    t_signal=np.array(t_signal)\n    t_signal_length=len(t_signal)\n    f_signal=fft(t_signal)\n    freqs=np.array(sp.fftpack.fftfreq(t_signal_length, d=1/float(sampling_freq)))# frequency values between [-25hz:+25hz]\n\n    # DC_component: f_signal values having freq between [-0.3 hz to 0 hz] and from [0 hz to 0.3hz] \n    #                                                             (-0.3 and 0.3 are included)\n\n    # noise components: f_signal values having freq between [-25 hz to 20 hz[ and from ] 20 hz to 25 hz] \n    #                                                               (-25 and 25 hz inculded 20hz and -20hz not included)\n\n    # selecting body_component: f_signal values having freq between [-20 hz to -0.3 hz] and from [0.3 hz to 20 hz] \n    #                                                               (-0.3 and 0.3 not included , -20hz and 20 hz included)\n\n\n    f_DC_signal=[] # DC_component in freq domain\n    f_body_signal=[] # body component in freq domain numpy.append(a, a[0])\n    f_noise_signal=[] # noise in freq domain\n\n    for i in range(len(freqs)):# iterate over all available frequencies\n\n        # selecting the frequency value\n        freq=freqs[i]\n\n        # selecting the f_signal value associated to freq\n        value= f_signal[i]\n\n        # Selecting DC_component values \n        if abs(freq)>0.3:# testing if freq is outside DC_component frequency ranges\n            f_DC_signal.append(float(0)) # add 0 to  the  list if it was the case (the value should not be added)                                       \n        else: # if freq is inside DC_component frequency ranges \n            f_DC_signal.append(value) # add f_signal value to f_DC_signal list\n\n        # Selecting noise component values \n        if (abs(freq)<=20):# testing if freq is outside noise frequency ranges \n            f_noise_signal.append(float(0)) # # add 0 to  f_noise_signal list if it was the case \n        else:# if freq is inside noise frequency ranges \n            f_noise_signal.append(value) # add f_signal value to f_noise_signal\n\n        # Selecting body_component values \n        if (abs(freq)<=0.3 or abs(freq)>20):# testing if freq is outside Body_component frequency ranges\n            f_body_signal.append(float(0))# add 0 to  f_body_signal list\n        else:# if freq is inside Body_component frequency ranges\n            f_body_signal.append(value) # add f_signal value to f_body_signal list\n\n    ################### Inverse the transformation of signals in freq domain ########################\n    # applying the inverse fft(ifft) to signals in freq domain and put them in float format\n    t_DC_component= ifft(np.array(f_DC_signal)).real\n    t_body_component= ifft(np.array(f_body_signal)).real\n    t_noise=ifft(np.array(f_noise_signal)).real\n\n    total_component=t_signal-t_noise # extracting the total component(filtered from noise) \n                                     #  by substracting noise from t_signal (the original signal).\n\n    # return outputs mentioned earlier\n    return (total_component,t_DC_component,t_body_component,t_noise) \n```\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8280884%2F4e1b1f5f22100534a74f6ffcd29336ce%2Fimg3.png?generation=1678285216443320&alt=media)\n\n이렇게 노이즈를 제거한 Raw 데이터를 이제는 고정된 크기의 윈도우로 슬라이딩 하며 샘플링을 진행했다고 합니다. 이때 샘플링한 윈도우의 크기는 시간의 단위를 가지는데 2.56초 간격으로 50%를 오버랩하며 샘플링을 수행했다고 합니다. 이때 센서 데이터는 50Hz 간격으로 측정됐기 때문에 2.56초를 계산하면 128개의 센서값을 샘플링 했다고 생각할 수 있습니다. 이러한 내용은 아래와 같은 코드로 구현이 가능합니다.\n\n```\ndef Windowing_type(time_sig_dic,Labels_Data_Frame):\n    columns=time_sig_dic['exp01_user01'].columns\n    window_ID=0\n    time_dictionary_window={}\n    BA_array=np.array(Labels_Data_Frame)\n\n    for line in BA_array:\n        file_key= 'exp' + normalize2(int(line[0]))  +  '_user' + normalize2(int(line[1]))\n\n        if line.shape[0] == 5 :\n          act_ID=line[2]\n          start_point=line[3]\n          end_point = line[4]\n        else :\n          act_ID='None'\n          start_point = line[2]\n          end_point = line[3]\n\n        for cursor in range(start_point,end_point-127,64):\n            end_point=cursor+128\n            data=np.array(time_sig_dic[file_key].iloc[cursor:end_point])\n            window=pd.DataFrame(data=data,columns=columns)\n            key='t_W'+normalize5(window_ID)+'_'+file_key+'_act'+normalize2(act_ID)\n            time_dictionary_window[key]=window\n            window_ID=window_ID+1\n\n    return time_dictionary_window \n```\n\n이렇게 센서 데이터에 대한 전처리를 마쳤으면, 이제 이 센서 데이터들을 유의미한 피처로 탈바꿈해야 합니다. 앞선 과정을 통해서 3축에 대한 자이로 센서 데이터와 가속도 센서 데이터 총 6가지 센서 값을 획득할 수 있었는데, 앞서 설명한 방법으로 가속도 센서는 Body와 Gravity 가속도로 분리하여 총 9가지의 센서 데이터를 얻을 수 있었습니다. 이러한 센서 데이터는 각각 'tBodyAcc-XYZ', 'tGravityAcc-XYZ', 'tBodyGyro-XYZ'로 명명할 수 있습니다. 이제 이 9개의 데이터로 저자는 유의미한 피처를 엔지니어링 합니다.\n\n####**Jerk-속도변화량**####\n가장 나이브한 방법으로 9가지 데이터에 대해서 각각 미분을 수행하여 각 센서들의 변화량을 피처로 추가합니다. 각 센서 데이터들을 미분하는 방법은 우리 모두가 알고 있는 그대로 수행하면 됩니다. 이러한 내용을 구현한 코드는 아래와 같습니다.\n\n```\ndt=0.02 # dt=1/50=0.02s time duration between two rows\n# Input: 1D array with lenght=N (N:unknown)\n# Output: 1D array with lenght=N-1\ndef jerk_one_signal(signal): \n        return np.array([(signal[i+1]-signal[i])/dt for i in range(len(signal)-1)])\n```\n\n이와 같이 각 센서 데이터들을 미분하고 각각을 'tBodyAccJerk-XYZ', 'tBodyGyroJerk-XYZ', 'fBodyAccJerk-XYZ' 로 명명합니다. 처음 9개(X,Y,Z 3축 * 3)의 센서 데이터에서 이제는 각각에 대한 미분량 9개(X,Y,Z 3축 * 3)가 추가돼 총 18개의 데이터를 만들었습니다.\n\n####**Mag-벡터의 크기 계산(X,Y,Z축을 통합한 크기 계산)**####\n다음으로는 각 센서들에 크기를 계산해 피처를 생산합니다. 이때 크기는 가장 단순하게 Euclidean norm을 통해 계산하게 됩니다. 이때 크기는 앞에서 언급한 데이터들은 X,Y,Z 축에 대해서 각각 데이터를 가지고 있었지만, 이제는 각 센서마다 X,Y,Z 값을 Euclidean norm으로 계산해 크기를 구합니다. 크기를 계산하는 방법은 아래 코드와 같습니다.\n\n```\nimport math\ndef mag_3_signals(x,y,z): # Euclidian magnitude\n    return [math.sqrt((x[i]**2+y[i]**2+z[i]**2)) for i in range(len(x))]\n```\n\n이를 통해서 앞서 구한 센서들의 각 축을 통합하는 크기를 계산할 수 있으며, 이를 각각 'tBodyAccMag', 'tGravityAccMag', 'tBodyAccJerkMag', 'tBodyGyroMag', 'tBodyGyroJerkMag' 로 명명합니다.\n\n####**시간 도메인에서 주파수 도메인으로 변경**####\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F8280884%2F72fe8c2dc5ad81c0e689dd3c89951e44%2Fimg4.png?generation=1678285792415177&alt=media)\n\n앞선 피처들은 시간 도메인에서 기술된 센서데이터로 만들었다면, 저자는 주파수 도메인에서 피처를 만들어 냅니다. 시간 도메인의 데이터를 주파수 도메인으로 옮기기 위해서 모두가 배웠던 Fast Fourier Transform을 사용합니다. 이를 통해서 앞에서 계산했던 피처들을 주파수 도메인에서 한번더 기술하게 됩니다. 이를 위한 코드는 아래와 같습니다.\n\n```\nfrom scipy import fftpack\nfrom numpy.fft import *\n\ndef fast_fourier_transform_one_signal(t_signal):\n    complex_f_signal= fftpack.fft(t_signal)\n    amplitude_f_signal=np.abs(complex_f_signal)\n\n    return amplitude_f_signal\n\ndef fast_fourier_transform(t_window):\n    f_window=pd.DataFrame()\n    for column in t_window.columns:\n        if 'grav' not in column:\n            t_signal=np.array(t_window[column])\n            f_signal= np.apply_along_axis(fast_fourier_transform_one_signal,0,t_signal)\n            f_window[\"f_\"+column[2:]]=f_signal\n    return f_window\n```\n기존에 만든 센서들에서 t가 시간 도메인을 의미했다면 이제는 FFT를 통해 주파수 도메인으로 변환했기 때문에 t를 f로 변경해 'fBodyAcc-XYZ', 'fBodyAccJerk-XYZ', 'fBodyGyro-XYZ', 'fBodyAccMag', 'fBodyAccJerkMag', 'fBodyGyroMag', 'fBodyGyroJerkMag'로 명명합니다.\n\n이렇게 구현한 시퀀스 센서 데이터를 기반으로 Feature를 추출합니다. 실제 해당 Feature를 추출하는 코드가 첫번째 Empty Module 입니다.\n\n```\n# -------------------------------------\n# [Empty Module #1] Feature Engineering\n# -------------------------------------\n\n# -------------------------------------\n# Feature Engineering\n# -------------------------------------\n# 목적: 제공된 36개의 시퀀스 도메인 데이터를 기반으로 피처모델링을 수행한다.\n# 입력인자: 시간(time) 도메인 Feature 20개 , 주파수(frequency) 도메인 Feature 16개\n# 출력인자: 분류모델 학습을 위한 Feature\n# -------------------------------------\n\n# ------------------------------------------------------------\n# 논문에서 제안하는 Feature Engineering 방법\n# ------------------------------------------------------------\n#\n# mean(): Mean value\n# std(): Standard deviation\n# mad(): Median absolute deviation \n# max(): Largest value in array\n# min(): Smallest value in array\n# sma(): Signal magnitude area\n# energy(): Energy measure. Sum of the squares divided by the number of values. \n# iqr(): Interquartile range \n# entropy(): Signal entropy\n# arCoeff(): Autorregresion coefficients with Burg order equal to 4\n# correlation(): correlation coefficient between two signals\n# maxInds(): index of the frequency component with largest magnitude\n# meanFreq(): Weighted average of the frequency components to obtain a mean frequency\n# skewness(): skewness of the frequency domain signal \n# kurtosis(): kurtosis of the frequency domain signal \n# bandsEnergy(): Energy of a frequency interval within the 64 bins of the FFT of each window.\n# angle(): Angle between to vectors.\n```\n\nFeature를 추출한 이후 데이터 정규화를 진행하고, RandomForest를 통한 분류를 수행합니다.\n\n데이터 정규화와 RandomForest 분류는 수업시간에 다뤘으므로 추가적인 설명은 하지 않겠습니다.\n\n```\n# -------------------------------------\n# [Empty Module #2] Data Normalization\n# -------------------------------------\n\n# -------------------------------------\n# Data Normalization\n# -------------------------------------\n# 목적: 앞서 구축한 train,test 셋에 대한 Feature를 정규화한다.\n# 입력인자: train 셋에서 추출된 Feature, test 셋에서 추출된 Feature\n# 출력인자: 정규화된 Feature Vector\n# -------------------------------------\n\n\nfrom sklearn.preprocessing import MinMaxScaler\n\n# ------------------------------------------------------------\n# 구현 가이드라인 \n# ------------------------------------------------------------\n# sklearn에서 제공하는 MinMaxScaler를 사용해 데이터 정규화를 진행한다.\n# (MinMaxScaler가 아닌 다른 정규화를 사용할 수 있다.)\n# ------------------------------------------------------------\n```\n\n```\n# -------------------------------------\n# [Empty Module #3] RandomForest를 이용한 분류\n# -------------------------------------\n\n# -------------------------------------\n# RandomForest를 이용한 분류\n# -------------------------------------\n# 목적: 앞서 완성한 train/test Feature를 RandomForest를 이용해 분류한다.\n# 주의사항 : 베이스라인의 성능은 random_state를 42로 설정한 결과이다.\n# 입력인자: Feature vector(train/test)\n# 출력인자: 분류결과\n# -------------------------------------\n\nfrom sklearn.ensemble import RandomForestClassifier\n\n# ------------------------------------------------------------\n# 구현 가이드라인 \n# ------------------------------------------------------------\n# sklearn에서 제공하는 RandomForest를 사용해 분류를 진행한다.\n# (RandomForest가 아닌 다른 분류모델을 사용할 수 있다.)\n# ------------------------------------------------------------\n```\n##**스켈레톤코드**##\n- 아래의 링크를 참고하세요\n   - https://www.kaggle.com/code/sjkimhyunwoo/2024-ml-w12p1-skeleton-code\n\n##**코멘트**##\n- 과제 진행에 어려움이 있다면, 담당 조교와 상의하세요.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    }
  ]
}