본문 바로가기
etc/공부방

[네부캠] 1주차 정리

by 베짱이28호 2023. 11. 10.

 

1. Pandas

1. 데이터 불러오기

csv, xlxs인지 맞춰서 불러오기.

import pandas as pd
import numpy as np
df1 = pd.read_csv(path)
# data : https://www.kaggle.com/code/agileteam/py-t1-3-map-expected-questions/notebook

 

기본적인 데이터는 head(n), tail(n), describe()를 통해서 앞, 뒷부분만 보거나 수치형 데이터를 요약한다.

데이터의 개수, 평균값, 표준편차, 최대, 최소, 사분위수를 출력한다.

row 개수와 별개로 count가 있다는건 결측치를 제외한 값임을 유추할 수 있다.

 

2. IQR : df[컬럼명].quantile(백분위수)

Q = [None]
for q in (0.25,0.5,0.75):
    Q.append(df1['f5'].quantile(q))
    
IQR = Q[3]-Q[1]
overQ3 = df1['f5'] > Q[3] + 1.5*IQR
underQ1 = df1['f5'] < Q[1] - 1.5*IQR
df1_outlier = df1[overQ3 | underQ1]

quantile을 통해 사분위수 찾기. describe를 통해서 요약할 수 있긴 하다.

overQ3, underQ1으로 조건을 주게되면 불리언 인덱싱으로 나온다.

불리언 인덱싱끼리 연산해서 f5컬럼의 outlier를 찾을 수 있다.

이 데이터에서는 없는듯

 

3. 결측치 처리 : df.isnull(), df.fillna()

h1,w1 = df1.shape
df1.isnull()
mv_ratio = df1.isnull().sum()/h1
pd.DataFrame(mv_ratio)

결측치 missing value는 df.isnull()로 확인한다.

df.insull()을 쓰면 전체 데이터 프레임에 결측치인 값이 True로 반환되는 불리언 데이터프레임이 나온다.

 

sum을 해주게 되면 전체 몇개인지가 나오게 되고 h1로 나눠주면 결측치 개수가 나온다.

missing value 비율이 높은 컬럼들은 filling을 해주거나, drop을 통해서 제거해야 학습률 향상에 도움이 된다.

요런식으로 결측치에 대한 비율을 구할 수 있다.

 

df1_del_mv = df1.drop(['f3'],axis=1)
cities_median = df1.groupby('city')['f1'].median()
df1['f1'] = df1['f1'].fillna(df1['city'].map(cities_median))

결측치 비율이 높은 f3을 제거한다. (axis = 1은 col제거, axis = 0 은 row제거)

 

4. 그루핑 : df.groupby()

groupby 함수는 SQL의 groupby와 비슷하게 집계함수와 같이쓴다.

groupby만 쓰게되면 객체를 가르키는 메모리 주소가 나오고, min(), mean() 등 집계함수와 쓰면 데이터 프레임을 반환한다.

groupby에서 구한 median값을 이용해서 컬럼을 fillna로 채운다.

map(dict)을 사용하면 column 값을 dict에 대응시킨다.

pd.DataFrame(df1.groupby("f4")["f5"].mean().sort_values(ascending=False))
# df1.groupby("f4")["f5"].mean().sort_values(ascending=False).plot(kind="bar")

위 예시는 f4로 분류한 후, f5의 평균값 분포를 나타낸 것이다. plot을 사용해서 바로 차트로 뽑을 수 있다.

 

5. 데이터 수정 : df.map 이용하기

temp = [data[0] for data in df1['f4']]
df1['type'] = temp
type_mapping = {'E':'외향','I':'내향'}
df1['성향'] = df1['type'].map(type_mapping)

df는 딕셔너리처럼 동작한다.

df1['type']이라는 col이 없었는데 temp에 MBTI 맨 앞을 따와서 저장하고, type이라는 컬럼에 대응시킨다.

type_mapping이라는 dict을 만들고 성향이라는 컬럼에 외향, 내향을 매핑한다.

 

6. 데이터 프레임 통합 : df.concat

# 0은 밑으로 붙이기. (새로운 데이터 추가)
# 1은 옆으로 붙이기. (새로운 특성 추가)
df =  pd.concat([train_df, test_df], axis=0)

새로운 특성이 추가된 경우에는 axis = 1로 설정해서 col 수를 늘려준다.

새로운 데이터가 추가된 경우에는 axis = 0으로 설정해서 row 수를 늘려준다

 

7. 데이터 수정 : df.apply(), df.transform()

# 20년전 나이를 age라고 하면 현재 나이는 age + 20이다.
df1.transform(lambda x: x+20,subset = ['age'])
df1['현재나이'] = df1['age'].apply(lambda x: x + 20)

 

기존 속성이 변화되지 않았다는 가정이면 df['age'] 컬럼을 transfrom을 사용해 수정한다. (기존 데이터 프레임을 바꾼다. inplace = True인 느낌?). 

apply는 새로운 컬럼에 할당을 한다. 현재 나이로 재검사한 데이터가 있다면, join을 이용해서 데이터 프레임을 결합할 수도 있을듯?

 

 

2. 넘파이

넘파이는 스킵.. 이미지 데이터를 다루면서 많이 실습할 예정..

인덱싱, 슬라이싱, where 조건, reshape 등 자주 사용하는 개념 위주로 복습하기

 

3. 수학

1. gradient discent

기본적인 발상은 convex한 함수에서 미분을 통해서 optimal value를 찾는것.

convex한 가정을 하면 step size가 일정하다는 가정하에, optimal value에 도달할 수 있다.

lr같은 경우에 현재 grad를 이용해서 계속 업데이트 해준다.

 

2. SGD

SGD, adaboost, adam 등 여러 방법이 있는데 SGD. (아마 시간 순으로 배우는듯?)

 

샘플 데이터를 사용하기 때문에 연산량이 적다.

기존 이미지 신호처리에서 O(N**2)만큼 걸렸다면, CNN에서도 fourier transform로 변환 후 커널을 사용하여 진행하면 O(NlogN)이 되는 것 처럼 연산량을 줄일 수 있다.

 

기존 gradient discent에 반해, non-convex 함수에서도 사용 가능하다는 장점이 있다. mini batch를 사용하기 때문에 목적함수가 계속 달라진다.

 

병렬처리에도 효과적이어서 HW적으로 GPU에 잘 맞는다고 한다.

 

3. Deep Learning

데이터 X에 선형 변환을 가해서 데이터 O로 매핑시킨다. O = XW + b

n차원 데이터 d개를 n차원 데이터 p개로 매핑한다.

 

softmax는 binary classfication에서 사용하는 sigmoid의 확장판같은 느낌. 즉, multi-class에서도 사용 가능하다.

softmax를 통해서 각 class에 속할 확률이 나오게 된다.

 

선형모델 + 활성함수를 통해 신경망을 구성한다.

보통 ReLU를 쓰고, 다른 논문들에서 봤는데 데이터의 특성에 따라 ReLU를 약간씩 변형해서 사용하는 경우도 있다.

다중층을 쓰는 이유는 목적함수를 근사하는데 필요한 node의 숫자가 줄어들게 된다. (각 층마다 적은 node를 사용해도 여러 층을 쌓으면 괜찮음)

층이 적을 경우에는 각 층마다 많은 수의 node를 요구하게 된다.

 

back propagation

출력에서 각 vector에 대한 grad를 구해야한다. 이후 parameter를 업데이트 해야하는데 chain rule을 통해서 역순으로 이전 층을 업데이트 한다.

 

4. 확률/통계

ML / MLE / MAP / MMSE / LMSE 등 여러 방법이 있다.

어떤 데이터가 주어졌을 때, 어떤 기준으로 모수를 추정할건지, 데이터의 분포를 알 수 있을지를 구한다.

 

랜덤프로세스 배울 때 배웠던 내용이지만, 예시라든지 그런게 와닿지가 않아서 정리가 안됐었는데 시간내서 공부하기.

 

베이즈 정리같은 경우에는 수식으로는 복잡해 보이지만, 지문을 주고 막상 구하라고 하면 당연히 하고있는 그런 내용.

 

5. CNN/RNN

convolution / cross correlation : 정의할 때 부호에서 차이난다. 부호에 따라서 커널이 뒤집히는 효과가 있고 조금 다르지만, convolution이라고 부르기로 한다고 함.

 

이미지같은 경우에는 3 channel, 알파채널에 이것저것 하면 더 늘어난다. 이에 맞추어서 conv 채널을 input channel에 맞게 늘려줘야한다. 2D에서는 각 kernel을 이미지와 겹쳐놓고, elemental wise 해주어 더해주면 된다.

 

시퀀스 데이터

중요한건 특정 시점 t에서 이전 시점 정보들 t1~ tn-1을 이용해서 시퀀스 데이터를 다룬다.

기존 RNN에서는 과거 시점 데이터를 제대로 활용하지 못하는 경우가 있는데 이를 해결한 것이 LSTM.

LSTM 그림을 보면 어떤 정보를 학습할지, 어떤 정보를 feedback 시킬지 결정한다.

 

feedback 과정에서 어떠한 활성함수를 사용할지도 중요하다. sigmoid보다 tanh를 쓰는 논문을 봤었는데, feedback 과정에서 양수 음수 모두 가능한 tanh가 더 좋다는 그런 내용을 봤었다.

 

4. 코테준비

[파이썬] 프로그래머스 : 타겟 넘버 (Lv.2) (tistory.com)

[파이썬] 백준 1926 : 그림 (실버1) (tistory.com)

[파이썬] 백준 1303 : 전쟁 - 전투 (실버1) (tistory.com)

 

이번 주 문제. 3 문제 모두 이전이랑 다르게 풀고 제출 포함 8~12분 정도 걸렸다.

출력 안찍고 한 호흡으로도 제출해서 맞을 수 있을만큼 연습하기.

스터디랑 병행하려니까 너무 빡세다... 자격증까지 있어서 이번주는 빼긴 했는데 너무바쁨.....

 

코멘트

양이 너무 많다.

이전에 resnet, LSTM 프로젝트 진행하면서 다 했던 내용들인데, 시간이 좀 지나서 그런가 가물가물...

과제 난이도 치고 시간이 오래걸렸다.

 

자격증 공부때문에 시간을 많이 못쓰는 중인데 12월 지나면 코테 + 교육만 열심히 하기.

pandas, numpy, sklearn은 빅분기 공부하면서 같이 병행하기.

SQL 공부하면서 겹치는 pandas 기능 익혀보기.

 

1주차라서 중구난방이다...... 강의 들으면서 타이핑, 필기, 실습하기.

'etc > 공부방' 카테고리의 다른 글

리트코드 문제풀이 진행 상황  (0) 2024.09.01
[네부캠] 5주차 정리  (0) 2023.12.04
[네부캠] 4주차 정리  (0) 2023.11.27
[네부캠] 3주차 정리  (0) 2023.11.20
[네부캠] 2주차 정리  (0) 2023.11.17

댓글