해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
최성철 교수님 - pandas
1) groupby
groupby는 SQL groupby 명령어랑 동일합니다. split, apply, combine 과정을 거쳐서 연산합니다. df.groupby("묶음의 기준이 되는 칼럼")["적용받는 칼럼"]. 적용받는 연산(), 한 개 이상의 column을 묶을 수 있습니다. 묶음의 기준이 되는 칼럼에 리스트 형태로 묶고 싶은 column명을 넣어주면 됩니다. 앞의 column을 기준으로 작성합니다. 엑셀의 피벗테이블과 동일한 효과를 얻을 수 있는 명령어입니다. Gropuby 명령의 결과물도 결국은 dataframe을 얻게 됩니다.
두 개의 column으로 groupby할 경우 인덱스가 2개가 생기는 데 이것을 Hierarchical index라고 부릅니다. unstack() 명령어를 통해서 묶인 데이터를 matrix 형태로 변경해줍니다. reset_index()로 groupby를 풀어주기도 합니다. swaplevel()로 groupby의 순서가 변경됩니다. 결과물만 출력되는 것이기 때문에 inplace=True를 적용해야 합니다. sort_index(level=0) 0번째 인덱스를 기준으로 정렬해줍니다. sort_values()를 값을 기준으로 정렬할 수 있습니다. Hierarchical index 기본 형태는 DataFrame이 아니고 Series입니다. 그래서 Series의 연산을 사용할 수 있는 데, level만 설정해주면 됩니다. groupby에 의해 Split 된 상태를 추출 가능합니다. 이 상태에서는 key, value 형태로 데이터를 추출할 수 있습니다.
grouped = df.groupby("column명")
for name, group in grouped:
print(name)
print(group)
위에서 정의된 grouped에서 특정 그룹을 추출하고 싶을 때에는 get_group("원하는대상")하면, dataframe 형태로 추출됩니다. grouped 된 상태에서는 세 가지 유형의 apply가 가능합니다. aggregation은 요약된 통계정보를 추출해 줍니다. Transformation은 해당 정보를 변환해줍니다. Filtration은 특정 정보를 제거하여 보여주는 필터링 기능입니다.
#aggregation
grouped.agg(sum)
grouped.agg([sum, max])
grouped.describe()
#transformation
score = lambda x: (x.max())
grouped.transform(score)
score = lambda x: (x -x.mean())/x.std()
grouped.transform(score)
#filter
df.groupby('column명').filter(lambda x : 조건)
2) pivot table, crosstab
pivot table은 excel에서 보던 것과 동일합니다. index 축은 groupby와 동일하고 column에 추가로 labeling 값을 추가하여 Value에 numeric type 값을 aggregation 하는 형태입니다.
# pivot table
df_phone.pivot_table(["duration"], index=[df_phone.month, df_phone.item], columns=df_phone.network,
aggfunc="sum", fill_value =0)
Crosstab은 특히 두 칼럼에 교차 빈도, 비율, 덧셈 등을 구할 때 사용합니다. Pivot table의 특수한 형태이며 User-Item Rating Matrix 등을 만들 때 사용 가능합니다.
pd.crosstab(index=df_movie.critic, columns=df_movie.title, values=df_movie.rating,
aggfunc="first").fillna(0)
3) merge & concat
merge는 SQL의 merge(join)와 같은 기능을 가지고 있으며, 두 개의 데이터를 하나로 합칠 때 사용합니다.
# merge
pd.merge(df_a, df_b on='subject_id') # 기준 : subject_id, left_on, right_on도 사용가능
concat은 같은 형태의 데이터를 붙이는 연산 작업입니다. 기본적으로 붙이는 list는 같은 칼럼을 가지고 있다고 생각한 상태로 연산을 진행합니다. append도 동일하게 작동합니다. axis에 따라 아래로 붙일지 옆으로 붙일지 선택할 수 있습니다.
4) persistence
Database에 sqlite3 라이브러리를 활용해서 접근해서 정보를 뽑아낼 수 있습니다. 다양한 pickle, excel 등으로 저장할 수 있습니다.
임성빈 교수님 - 확률론
1) 딥러닝에서 확률론이 왜 필요한가요?
딥러닝은 확률론 기반의 기계학습 이론에 바탕을 두고 있습니다. 기계학습에서 사용되는 손실 함수(loss function)들의 작동 원리는 데이터 공간을 통계적으로 해석해서 유도하게 됩니다. 회귀 분석에서 손실 함수로 사용되는 L2-노름은 예측 오차의 분산을 가장 최소화하는 방향으로 학습하도록 유도합니다. 분류 문제에서 사용되는 교차 엔트로피(cross-entropy)는 모델 예측의 불확실성을 최소화하는 방향으로 학습하도록 유도합니다. 분산 및 불확실성을 최소화하기 위해서는 측정하는 방법을 알아야 합니다. 데이터 공간 $X \times Y$라 표기하고 $D$를 해당 공간에서 데이터를 추출하는 확률분포라고 부릅니다. $D$를 한 번에 아는 것은 불가능합니다. 그래서 기계학습 모형을 통해서 확률분포 $D$를 추정합니다.
2) 확률 변수
확률변수는 확률분포 $D$에 따라 이산형(discrete)과 연속형(continuous) 확률변수로 구분할 수 있습니다. 이산형 확률 변수는 확률변수가 가질 수 있는 경우의 수를 모두 고려하여 확률을 더해서 모델링합니다. 아래의 식으로 표현할 수 있습니다.
$$\mathbb{P}(X \in A) = \sum_{x \in A}P(X = x)$$
연속형 확률변수는 데이터 공간에 정의된 확률변수의 밀도(density) 위에서의 적분을 통해 모델링합니다. 여기서 밀도는 누적확률분포의 변화율을 모델링하며 확률로 해석하면 안 됩니다.
$$\mathbb{P}(X \in A) = \int_{A}P(x)dx, P(x) = \lim_{h\rightarrow 0}\frac{\mathbb{P}(x - h \leq X \leq x+h)}{2h}$$
참고적으로 이산형, 연속형이 모든 확률변수를 구분하지 않습니다.
결합 분포 $P(x,y)$는 원래 확률분포 $D$가 연속인지 이산인지에 따라 모델링하지는 않습니다. 그래서 결합 분포는 주어진 데이터의 모양을 보고 적절하게 모델링하게 됩니다. $P(x)$는 입력 $x$에 대한 주변확률분포로 $y$에 대한 정보를 주진 않습니다. 주변확률분포 $P(x)$는 결합분포 $P(x, y)$에서 유도가 가능합니다.
$$P(x) = \sum_{y} P(x, y), P(x) = \int_{y} P(x, y) dy$$
시그마를 활용한 것이 이산형, 적분을 활용한 것이 연속형에서 활용하는 식입니다. $P(y)$도 $P(x)$처럼 동일하게 주변 확률분포를 구할 수 있습니다. 조건부 확률분포 $P(x|y)$는 데이터 공간에서 입력 $x$와 출력 $y$ 사이의 관계를 모델링합니다. 여기서 $P(x|y)$는 특정 클래스가 주어진 조건에서 데이터의 확률분포를 보여줍니다. 조건부 확률분포를 살펴보게 되면 좀 더 명확하게 데이터들의 분포들을 살펴볼 수 있다는 장점이 있습니다. 조건부 확률 $P(y|x)$는 입력 변수 $x$에 대해 정답이 $y$일 확률을 의미합니다. 다만, 여기서도 연속 확률분포의 경우 밀도로 해석해야 한다는 것을 주의해야 합니다. 이러한 조건부 확률은 로지스틱 회귀에서 데이터에서 추출된 패턴을 기반으로 확률을 해석하는 데 사용됩니다. 분류 문제에서 softmax$(W\phi+b)$는 데이터 $x$로부터 추출된 특징 패턴 $\phi(x)$와 가중치 행렬 $W$을 통해 조건부 확률 $P(y|x)$을 계산합니다. 분류가 아닌 회귀 문제의 경우 보통 연속 확률변수를 다루기 때문에 확률로 해석하기는 어렵습니다. 조건부 기댓값 $\mathbb{E}[y|x]$을 추정하게 됩니다. 아래의 식으로 조건부 기댓값을 구할 수 있습니다.
$$\mathbb{E}_{y \sim P(y|x)}[y|x] = \int_{y} yP(y|x)dy$$
그러면 왜 조건부 기댓값을 사용하게 되는 것일까요? 여기서 사용되는 기댓값은 L2-norm(목적식)을 최소화하는 함수와 일치하기 때문에 사용합니다. 항상 사용해야 되는 것은 아니고 median을 사용해서 추정하기도 합니다. 딥러닝은 다층 신경망을 사용해서 데이터로 특징 패턴 $\phi$을 추출합니다. 특징 패턴을 학습하기 위해 어떤 손실 함수를 사용할지는 기계학습 문제와 모델에 의해 결정됩니다.
3) 기댓값이 뭔가요?
확률분포가 주어지면 데이터를 분석하는 데 사용 가능한 여러 종류의 통계적 범함수(statistical functional)를 계산할 수 있습니다. 기댓값(expectation)은 데이터를 대표하는 통계량이면서 동시에 확률분포를 통해 다른 통계적 범함수를 계산하는 데 사용됩니다. 기댓값을 이용해서 분산, 첨도(kurtosis), 공분산(covariance) 등 여러 가지 통계량을 계산할 수 있습니다.
4) 몬테카를로 샘플링
기계학습의 많은 문제들은 확률분포를 명시적으로 모를 때가 대부분입니다. 확률분포를 모를 때 데이터를 이용하여 기댓값을 계산하려면 몬테카를로(Monte Carlo) 샘플링 방법을 사용해야 합니다. 몬테카를로는 이산형이든 연속형이든 상관없이 성립합니다. 샘플링할 때, 독립적으로 샘플링해야 몬테카를로 샘플링 방법이 성립합니다.
$$\mathbb{E}_{x \sim P(x)}[f(x)] \approx \frac{1}{N}\sum_{i = 1}^{N} f(x^{(i)}), x^{(i)} \underset{\sim }{i.i.d.} P(x)$$
몬테카를로 샘플링은 독립 추출만 보장된다면 대수의 법칙(law of large number)에 의해 수렴성을 보장합니다. 아래의 코드 블록은 원주율을 몬테카를로 샘플링으로 추정해본 코드입니다. 추정해본 결과 대략 3.13~3.14에 수렴하는 것을 볼 수 있습니다. 샘플 사이즈와 반복 횟수를 더 늘리면 더 수렴합니다.
import numpy as np
def mc_int(fun, low, high, sample_size=100, repeat=10):
int_len = np.abs(high-low)
stat = []
for _ in range(repeat):
x = np.random.uniform(low=low, high=high, size=sample_size)
fun_x = fun(x)
int_val = int_len * np.mean(fun_x)
stat.append(int_val)
return np.mean(stat), np.std(stat)
def f_x(x):
return 2*np.sqrt(1-x**2)
print(mc_int(f_x, low=-1, high=1, sample_size=10000, repeat=100))
2. 피어 세션 정리
수업 관련 질문
- pandas 메모리 이슈 - pandas의 downcast를 활용하면 좀 더 효율적으로 활용이 가능하다.
- SQL 관련 - SQL은 생각보다 시간과 자원이 많이 들어서 elastic search를 활용해서 json파일을 불러왔던 경험이 있음. 그래도, SQL은 많이 활용되고 있다.
- likelihood는 무엇인가? 집단에서 일부를 추출했을 때의 값이 주어졌을 때, 이 관측 결과가 정규분포 $D$를 따를 확률