-
[2022_하계_모각코] 4회차(08/01)카테고리 없음 2022. 8. 2. 16:19
4회차 목표
데이콘 반도체 박막 두께 분석하기
1. 배경
반도체 박막을 수십~수백 층 쌓아 올리는 공정에서는 박막의 결함으로 인한 두께와 균일도가 저하되는 문제점이 발생한다. 이는 소자 구조의 변형을 야기하는 성능 하락의 주요 요인이 되기 때문에, 박막의 두께를 빠르면서도 정확히 측정하는 것이 중요하다.
반도체 박막은 얇은 반도체 막으로 박막의 종류와 두께는 반도체 소자의 특성을 결정짓는 중요한 요소 중 하나이다. 이 박막의 두께를 측정하는 방법은 반사율을 측정하는 것이다.
(반사율 = 반사광/입사광) 2. 구조 설명
질화규소 layer_1 이산화규소 layer_2 질화규소 layer_3 이산화규소 layer_4 규소 기판 제공되는 train.css 파일에는 각 층의 두께와 반사율 스펙트럼이 포함되어 있다고 한다.
3. 데이터 설명
- 4층 박막의 두께(layer_1~layer_4)와 파장에 따른 반사율 스펙트럼이 주어진다.
- 헤더 이름인 0~225는 빛의 파장에 해당하는 반사율으로, 비식별화 처리가 되어있다.
4. 데이콘 baseline 코드 따라하기
https://dacon.io/competitions/official/235554/codeshare/461?page=1&dtype=recent
반도체 박막 두께 분석 baseline code
반도체 박막 두께 분석 경진대회
dacon.io
import pandas as pd import warnings from keras.models import Sequential from keras.layers import Dense # 데이터를 불러온다 warnings.filterwarnings('ignore') train = pd.read_csv('train.csv') test = pd.read_csv('test.csv') # 독립변수와 종속변수 분리한다 train_X = train.iloc[:, 4:] train_Y = train.iloc[:, :4] test_X = test.iloc[:, 1:] # 케라스를 통해 모델 생성을 시작한다 model = Sequential() model.add(Dense(units=160, activation='relu', input_dim=226)) model.add(Dense(units=160, activation='relu')) model.add(Dense(units=160, activation='relu')) model.add(Dense(units=4, activation='linear')) # 모델을 컴파일한다. model.compile(loss='mae', optimizer='adam', metrics=['mae']) # 모델을 학습한다. model.fit(train_X, train_Y, epochs=20, batch_size=10000, validation_split=0.05) # 예측값을 생성한다. pred_test = model.predict(test_X) # submission 파일을 생성한다. sample_sub = pd.read_csv('sample_submission.csv', index_col=0) submission = sample_sub+pred_test submission.to_csv('submission.csv')
Epoch 1/20 77/77 [==============================] - 16s 167ms/step - loss: 95.7348 - mae: 95.7348 - val_loss: 96.0422 - val_mae: 96.0421 Epoch 2/20 77/77 [==============================] - 10s 134ms/step - loss: 74.7934 - mae: 74.7934 - val_loss: 94.1047 - val_mae: 94.1047 Epoch 3/20 77/77 [==============================] - 12s 150ms/step - loss: 73.8263 - mae: 73.8263 - val_loss: 93.0890 - val_mae: 93.0890 Epoch 4/20 77/77 [==============================] - 13s 165ms/step - loss: 71.3813 - mae: 71.3813 - val_loss: 92.0089 - val_mae: 92.0089 Epoch 5/20 77/77 [==============================] - 11s 145ms/step - loss: 67.8848 - mae: 67.8848 - val_loss: 91.0310 - val_mae: 91.0310 Epoch 6/20 77/77 [==============================] - 10s 135ms/step - loss: 65.9423 - mae: 65.9423 - val_loss: 88.9058 - val_mae: 88.9058 Epoch 7/20 77/77 [==============================] - 10s 136ms/step - loss: 64.4981 - mae: 64.4981 - val_loss: 87.7330 - val_mae: 87.7330 Epoch 8/20 77/77 [==============================] - 9s 115ms/step - loss: 62.9887 - mae: 62.9887 - val_loss: 84.4211 - val_mae: 84.4211 Epoch 9/20 77/77 [==============================] - 9s 113ms/step - loss: 61.7818 - mae: 61.7818 - val_loss: 80.7816 - val_mae: 80.7816 Epoch 10/20 77/77 [==============================] - 9s 113ms/step - loss: 60.5990 - mae: 60.5990 - val_loss: 78.1818 - val_mae: 78.1818 Epoch 11/20 77/77 [==============================] - 7s 95ms/step - loss: 59.2792 - mae: 59.2792 - val_loss: 75.7698 - val_mae: 75.7698 Epoch 12/20 77/77 [==============================] - 7s 90ms/step - loss: 58.0608 - mae: 58.0608 - val_loss: 74.9228 - val_mae: 74.9228 Epoch 13/20 77/77 [==============================] - 8s 100ms/step - loss: 57.2851 - mae: 57.2851 - val_loss: 74.4456 - val_mae: 74.4456 Epoch 14/20 77/77 [==============================] - 7s 92ms/step - loss: 56.6848 - mae: 56.6848 - val_loss: 74.2582 - val_mae: 74.2582 Epoch 15/20 77/77 [==============================] - 9s 111ms/step - loss: 56.0935 - mae: 56.0935 - val_loss: 73.6912 - val_mae: 73.6912 Epoch 16/20 77/77 [==============================] - 9s 122ms/step - loss: 55.5210 - mae: 55.5210 - val_loss: 73.4022 - val_mae: 73.4022 Epoch 17/20 77/77 [==============================] - 9s 114ms/step - loss: 54.9302 - mae: 54.9302 - val_loss: 71.8129 - val_mae: 71.8129 Epoch 18/20 77/77 [==============================] - 9s 122ms/step - loss: 54.3998 - mae: 54.3998 - val_loss: 72.6745 - val_mae: 72.6745 Epoch 19/20 77/77 [==============================] - 10s 125ms/step - loss: 53.8538 - mae: 53.8538 - val_loss: 71.7000 - val_mae: 71.7000 Epoch 20/20 77/77 [==============================] - 9s 117ms/step - loss: 53.2845 - mae: 53.2845 - val_loss: 71.6296 - val_mae: 71.6296 313/313 [==============================] - 2s 3ms/step
5. EDA
library import & load data
import pandas as pd import warnings import missingno as msno import seaborn as sns import matplotlib.pyplot as plt warnings.filterwarnings('ignore') train = pd.read_csv('train.csv') test = pd.read_csv('test.csv') print(train.columns) print(test.columns) print(train.shape) print(test.shape)
Index(['layer_1', 'layer_2', 'layer_3', 'layer_4', '0', '1', '2', '3', '4', '5', ... '216', '217', '218', '219', '220', '221', '222', '223', '224', '225'], dtype='object', length=230) Index(['id', '0', '1', '2', '3', '4', '5', '6', '7', '8', ... '216', '217', '218', '219', '220', '221', '222', '223', '224', '225'], dtype='object', length=227) (810000, 230) (10000, 227)
각 파장별 요약값 확인
pd.set_option('display.max_columns', 230) train.describe()
결측치 확인
msno.matrix(train)
박막의 두께별 빛의 파장에 따른 반사율 평균 비교
figure, ((ax1, ax2, ax3, ax4)) = plt.subplots(nrows = 4,ncols = 1) figure.set_size_inches(15,30) train_layer1 = train.drop(['layer_2','layer_3','layer_4'],axis=1).groupby(['layer_1']).mean() train_layer2 = train.drop(['layer_1','layer_3','layer_4'],axis=1).groupby(['layer_2']).mean() train_layer3 = train.drop(['layer_1','layer_2','layer_4'],axis=1).groupby(['layer_3']).mean() train_layer4 = train.drop(['layer_1','layer_2','layer_3'],axis=1).groupby(['layer_4']).mean() sns.heatmap(train_layer1.T,ax = ax1) ax1.set_title('layer_1 heatmap',fontsize = 10) sns.heatmap(train_layer2.T,ax = ax2) ax2.set_title('layer_2 heatmap',fontsize = 10) sns.heatmap(train_layer3.T,ax = ax3) ax3.set_title('layer_3 heatmap',fontsize = 10) sns.heatmap(train_layer4.T,ax = ax4) ax4.set_title('layer_4 heatmap',fontsize = 10)
6. 딥러닝 & DNN
딥러닝은 연속된 층으로 표현을 학습한다는 개념으로 층 기반 표현 학습이나 계층적 표현 학습이라고도 한다.
- feed-forward 방식
- 1개 이상의 hidden layer를 가짐
- fully-connected
- bi-partie graph
- hidden layer들을 여러 개 쌓아 상위 패턴을 인지함
딥러닝의 목표
정확한 값을 찾는 것
딥러닝의 작동방법
- 입력값들의 weighted sum과 bias에 대하여 활성화함수를 통해 비선형 패턴을 인지한다.
- 처음부터 weight값을 정확하게 알아낼 수 없기 때문에 무작위 초기화를 거친 후 손실 점수가 낮아지는 방향으로 가중치를 조절해나가며 반복적으로 학습시킨다.
- 손실 함수에서 나온 값을 피드백 신호로 사용하여 손실 점수를 낮추는 방향으로 가중치를 조금씩 조절해 나간다. 이 때 조절은 역전파 알고리즘을 구현하는 옵티마이저의 역할이다.
# 독립변수와 종속변수를 분리한다 train_X = train.iloc[:,4:] train_Y = train.iloc[:,0:4] test_X = test.iloc[:,1:]
DNN의 정의
모델의 은닉청을 많이 늘리면서 학습의 결과를 향상시키는 방법으로 은닉층을 2개 이상 갖고 있는 학습 방법
DNN의 특징
컴퓨터 스스로 학습을 반복하여 최적의 weight를 찾아 결과 도출
# 케라스를 통해 모델 생성을 시작한다. import keras from keras.models import Sequential from keras.layers import Dense model = Sequential() # model 초기화 model.add(Dense(units=160, activation='relu', input_dim=226)) # 첫 번째 은닉층 # 226개 feature, 160개 뉴런, relu 함수를 활성화 함수로 사용 model.add(Dense(units=160, activation='relu')) # 두 번째 은닉층 model.add(Dense(units=160, activation='relu')) # 세 번째 은닉층 model.add(Dense(units=4, activation='linear')) # 출력층 (4개의 output을 도출해내야되기 때문에 units = 4)
ㅇ
4회차 회고록 (2022.08.01)
이번 모각코 시간에는 지금까지 공부한 머신러닝 지식을 바탕으로 데이콘의 반도체 박막 두께 분석하기 경진대회의 데이터를 분석해보았다. 이미 끝난 대회라 인터넷상에 자료가 많아 모르는 부분은 하나하나 찾아보고, 다른 사람들이 공유한 코드를 참고할 수 있어서 좋았다. 코드가 아니라 모듈 관련한 오류가 Pycharm에서 계속 뜨는 관계로, 계획한 것보다 많은 양을 공부하지는 못해서 아쉬웠다. 그렇지만 어떤 언어든 어떤 결과물이든 디버깅 과정을 통해서 배우는 것이 가장 많기 때문에 유익했다.