{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":77476,"databundleVersionId":8462666,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-15T01:37:44.893219Z","iopub.execute_input":"2024-05-15T01:37:44.894096Z","iopub.status.idle":"2024-05-15T01:37:44.903412Z","shell.execute_reply.started":"2024-05-15T01:37:44.894062Z","shell.execute_reply":"2024-05-15T01:37:44.902219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/2024-smarcle-ks-3-fashion-mnist2/train.csv\")\ntest = pd.read_csv(\"/kaggle/input/2024-smarcle-ks-3-fashion-mnist2/test.csv\")\nsubmission = pd.read_csv(\"/kaggle/input/2024-smarcle-ks-3-fashion-mnist2/sample_submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:37:44.905574Z","iopub.execute_input":"2024-05-15T01:37:44.905881Z","iopub.status.idle":"2024-05-15T01:37:50.828307Z","shell.execute_reply.started":"2024-05-15T01:37:44.905855Z","shell.execute_reply":"2024-05-15T01:37:50.827087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"overview에 따르면, fashion mnist 데이터셋은 운동화, 셔츠, 샌들 등 이미지들의 모음이며, 28x28 픽셀의 이미지의 각 위치의 픽셀값이 하나하나씩 들어있습니다. 데이터셋을 로드하여 확인해보면","metadata":{}},{"cell_type":"code","source":"train","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:37:50.829707Z","iopub.execute_input":"2024-05-15T01:37:50.830028Z","iopub.status.idle":"2024-05-15T01:37:50.860815Z","shell.execute_reply.started":"2024-05-15T01:37:50.829999Z","shell.execute_reply":"2024-05-15T01:37:50.859710Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"총 6만개의 개별적인 이미지 데이터가 있는 것을 알 수 있습니다.","metadata":{}},{"cell_type":"code","source":"train_data = np.array(train, dtype='float32')\ntest_data = np.array(test,dtype='float32')","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:37:50.863175Z","iopub.execute_input":"2024-05-15T01:37:50.863547Z","iopub.status.idle":"2024-05-15T01:37:51.042119Z","shell.execute_reply.started":"2024-05-15T01:37:50.863516Z","shell.execute_reply":"2024-05-15T01:37:51.040912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"넘파이 배열로 바꿔줘야 텐서플로와 케라스에서 사용할 수 있다고 하네요(안하면 아래처럼 시각화 안됨)","metadata":{}},{"cell_type":"code","source":"train_x = train_data[:,1:]/255\ntrain_y = train_data[:,0]\ntest_x = test_data/255","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:37:51.043388Z","iopub.execute_input":"2024-05-15T01:37:51.043735Z","iopub.status.idle":"2024-05-15T01:37:51.112942Z","shell.execute_reply.started":"2024-05-15T01:37:51.043690Z","shell.execute_reply":"2024-05-15T01:37:51.111614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"일반적으로 MinMaxScaler를 사용하는 것이 좋지만, 픽셀 데이터는 0부터 255의 값을 가지므로 단순히 255로 나눠줘도 됨(혹은 모델링할때 -1~1 범위로 표준화하는 것이 좋은지 성능 비교해보기)","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nclass_names = ['T_shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', \n               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']\nplt.figure(figsize=(10, 10))\nfor i in range(36):\n    plt.subplot(6, 6, i + 1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.grid(False)\n    plt.imshow(train_x[i].reshape((28,28)))\n    label_index = int(train_y[i])\n    plt.title(class_names[label_index])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:37:51.114597Z","iopub.execute_input":"2024-05-15T01:37:51.114934Z","iopub.status.idle":"2024-05-15T01:37:53.039348Z","shell.execute_reply.started":"2024-05-15T01:37:51.114905Z","shell.execute_reply":"2024-05-15T01:37:53.038331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"10종류의 의류 종류가 어떻게 나뉘는지 확인해볼 수 있습니다","metadata":{}},{"cell_type":"code","source":"from sklearn.neighbors import KNeighborsClassifier\nKNN_Classifier = KNeighborsClassifier(weights = 'distance')\nKNN_Classifier.fit(train_x, train_y)\npred = KNN_Classifier.predict(test_x)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:37:53.040921Z","iopub.execute_input":"2024-05-15T01:37:53.041280Z","iopub.status.idle":"2024-05-15T01:38:05.357729Z","shell.execute_reply.started":"2024-05-15T01:37:53.041232Z","shell.execute_reply":"2024-05-15T01:38:05.356666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred = pred.astype('int64')","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:38:05.359115Z","iopub.execute_input":"2024-05-15T01:38:05.359484Z","iopub.status.idle":"2024-05-15T01:38:05.367809Z","shell.execute_reply.started":"2024-05-15T01:38:05.359444Z","shell.execute_reply":"2024-05-15T01:38:05.366822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['label'] = pred","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:38:05.371430Z","iopub.execute_input":"2024-05-15T01:38:05.371795Z","iopub.status.idle":"2024-05-15T01:38:05.377244Z","shell.execute_reply.started":"2024-05-15T01:38:05.371752Z","shell.execute_reply":"2024-05-15T01:38:05.376086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(\"test.csv\",index=False)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:38:05.378619Z","iopub.execute_input":"2024-05-15T01:38:05.379025Z","iopub.status.idle":"2024-05-15T01:38:05.402081Z","shell.execute_reply.started":"2024-05-15T01:38:05.378994Z","shell.execute_reply":"2024-05-15T01:38:05.400864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"궁금해서 간단하게 KNN쓰고 예측해봤는데 0.86이 나오네요. 다른 전처리를 해주면 성능 향상을 기대할 수 있을지 테스트 해봐야할듯","metadata":{}},{"cell_type":"markdown","source":"# 2회차","metadata":{}},{"cell_type":"markdown","source":"아무래도 2차원 이미지 데이터이다보니 CNN으로 학습시키는 것이 가장 합리적으로 보여짐. PCA 처리를 한 경우가 많던데 안하고 raw 데이터를 이용했을 때 학습시간만 충분히 주어진다면 더 정확한 성능을 얻을 수 있을 것으로 예상","metadata":{}},{"cell_type":"code","source":"train_x = train_x.reshape(train_x.shape[0],28,28,1)\ntest_x = test_x.reshape(test_x.shape[0],28,28,1)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:38:05.403460Z","iopub.execute_input":"2024-05-15T01:38:05.404249Z","iopub.status.idle":"2024-05-15T01:38:05.409565Z","shell.execute_reply.started":"2024-05-15T01:38:05.404218Z","shell.execute_reply":"2024-05-15T01:38:05.408428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.utils import to_categorical\ntarget = to_categorical(train_y)\ntarget.shape","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:38:05.410750Z","iopub.execute_input":"2024-05-15T01:38:05.411021Z","iopub.status.idle":"2024-05-15T01:38:05.423376Z","shell.execute_reply.started":"2024-05-15T01:38:05.410997Z","shell.execute_reply":"2024-05-15T01:38:05.422316Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D\nimport tensorflow as tf\n\nseed = 47\nnp.random.seed(seed)\ntf.random.set_seed(seed)\n\nmodel = Sequential()\nmodel.add(Conv2D(32, kernel_size=(3,3), input_shape=(28,28,1),activation='relu'))\nmodel.add(Conv2D(64,(3,3),activation='relu'))\nmodel.add(MaxPooling2D(pool_size=2))\nmodel.add(Dropout(0.25))\nmodel.add(Flatten())\nmodel.add(Dense(128,activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10,activation='softmax'))\n\nmodel.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])\nmodel.fit(train_x,target)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:38:05.424776Z","iopub.execute_input":"2024-05-15T01:38:05.425078Z","iopub.status.idle":"2024-05-15T01:38:16.234758Z","shell.execute_reply.started":"2024-05-15T01:38:05.425052Z","shell.execute_reply":"2024-05-15T01:38:16.233694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred= model.predict(test_x)\nans=np.argmax(pred,axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:43:25.340413Z","iopub.execute_input":"2024-05-15T01:43:25.340824Z","iopub.status.idle":"2024-05-15T01:43:26.062820Z","shell.execute_reply.started":"2024-05-15T01:43:25.340792Z","shell.execute_reply":"2024-05-15T01:43:26.061700Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"predict 에서 카테고리컬 데이터에 대해서 각 label일 확률을 반환하고, 이중 가장 높은 확률인 label로 변환해주는 함수 argmax를 사용하면 하나의 label로 다 바꾼 결과를 반환해준다.\npred 자체는 (10000,10)의 df임","metadata":{}},{"cell_type":"code","source":"submission['label'] = ans\nsubmission.to_csv(\"20011860.csv\",index=False)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:45:01.100592Z","iopub.execute_input":"2024-05-15T01:45:01.100986Z","iopub.status.idle":"2024-05-15T01:45:01.121291Z","shell.execute_reply.started":"2024-05-15T01:45:01.100955Z","shell.execute_reply":"2024-05-15T01:45:01.120046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"타겟컬럼을 submission에 대입하고 csv 파일 생성\n점수 : 0.89310","metadata":{}},{"cell_type":"code","source":"model2 = Sequential()\nmodel2.add(Conv2D(32, kernel_size=(5,5), input_shape=(28,28,1),activation='relu'))\nmodel2.add(Conv2D(64,(5,5),activation='relu'))\nmodel2.add(MaxPooling2D(pool_size=2))\nmodel2.add(Dropout(0.25))\nmodel2.add(Flatten())\nmodel2.add(Dense(128,activation='relu'))\nmodel2.add(Dropout(0.5))\nmodel2.add(Dense(10,activation='softmax'))\n\nmodel2.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])\nmodel2.fit(train_x,target)\n\npred2= model2.predict(test_x)\nans2=np.argmax(pred2,axis=1)\nsubmission['label'] = ans2\nsubmission.to_csv(\"20011860_2.csv\",index=False)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:52:59.469600Z","iopub.execute_input":"2024-05-15T01:52:59.470292Z","iopub.status.idle":"2024-05-15T01:53:13.089003Z","shell.execute_reply.started":"2024-05-15T01:52:59.470250Z","shell.execute_reply":"2024-05-15T01:53:13.087788Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"다른 model2도 하나 생성 -> kernel_size (5,5)로 조정한 결과 0.88390의 점수 얻음\n영상처리 하면서도 느끼지만 필터 사이즈를 키운다고 해서 항상 좋은 결과가 나오는거같진 않음 (3,3)이 더 정확","metadata":{}},{"cell_type":"code","source":"model3 = Sequential()\nmodel3.add(Conv2D(32, kernel_size=(2,2), input_shape=(28,28,1),activation='relu'))\nmodel3.add(Conv2D(64,(2,2),activation='relu'))\nmodel3.add(MaxPooling2D(pool_size=2))\nmodel3.add(Dropout(0.25))\nmodel3.add(Flatten())\nmodel3.add(Dense(128,activation='relu'))\nmodel3.add(Dropout(0.5))\nmodel3.add(Dense(10,activation='softmax'))\n\nmodel3.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])\nmodel3.fit(train_x,target)\n\npred3= model3.predict(test_x)\nans3=np.argmax(pred3,axis=1)\nsubmission['label'] = ans3\nsubmission.to_csv(\"20011860_3.csv\",index=False)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T01:56:24.789017Z","iopub.execute_input":"2024-05-15T01:56:24.790021Z","iopub.status.idle":"2024-05-15T01:56:38.278578Z","shell.execute_reply.started":"2024-05-15T01:56:24.789982Z","shell.execute_reply":"2024-05-15T01:56:38.277546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"(2,2)로 만든 모델은 0.89450 -> Best Score //\n모델 성능 향상을 위해 추가적인 하이퍼파라미터 튜닝을 해볼 수 있지만 리더보드 순위를 보니 상위권 등극은 힘들듯. 좋은 점수 노트북 참고하기보단 능력껏 스스로 해본거니 여기까지 하겠습니다","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}