2021년 1월 28일 목요일

AITech 학습정리-[DAY 9] Pandas II / 확률론

  

======================

학습내용

pandas II


Groupby 1


df.groupby("Team")["Points"].std()


h_index = df.groupby(["Team", "Year"])["Points"].sum()
Team    Year
Devils  2014    863
        2015    673
Kings   2014    741
        2016    756
        2017    788
Riders  2014    876
        2015    789
        2016    694
        2017    690
Royals  2014    701
        2015    804
kings   2015    812
Name: Points, dtype: int64

h_index.index
MultiIndex([('Devils', 2014),
            ('Devils', 2015),
            ( 'Kings', 2014),
            ( 'Kings', 2016),
            ( 'Kings', 2017),
            ('Riders', 2014),
            ('Riders', 2015),
            ('Riders', 2016),
            ('Riders', 2017),
            ('Royals', 2014),
            ('Royals', 2015),
            ( 'kings', 2015)],
           names=['Team', 'Year'])

h_index["Devils":"Kings"]
Team    Year
Devils  2014    863
        2015    673
Kings   2014    741
        2016    756
        2017    788
Name: Points, dtype: int64



h_index.unstack()
Year2014201520162017
Team
Devils863.0673.0NaNNaN
Kings741.0NaN756.0788.0
Riders876.0789.0694.0690.0
Royals701.0804.0NaNNaN
kingsNaN812.0NaNNaN


h_index.swaplevel()


h_index.sort_index(level=1) # 레벨을 잘 지정해줘야 함


h_index.std(level=0) # 레벨을 잘 지정해줘야 함

h_index.sum(level=1) # 레벨을 잘 지정해줘야 함



Group by 2


grouped = df.groupby("Team")
for name, group in grouped:
    print(name)
    print(group)

grouped.get_group("Devils")


grouped.agg(max)

grouped.agg(np.mean)


grouped.describe().T


grouped.transform(lambda x: x)  # 하면 원래 값 나옴

score = lambda x: (x - x.mean()) / x.std()
grouped.transform(score)  # 정규화 된 값 출력


df.groupby("Team").filter(lambda x: len(x) >= 3)

df.groupby("Team").filter(lambda x: x["Points"].mean() > 700)


Case study


[4]
indexdatedurationitemmonthnetworknetwork_type
0015/10/14 06:5834.429data2014-11datadata
1115/10/14 06:5813.000call2014-11Vodafonemobile
2215/10/14 14:4623.000call2014-11Meteormobile
3315/10/14 14:484.000call2014-11Tescomobile
4415/10/14 17:274.000call2014-11Tescomobile
[8]
index                    int64
date            datetime64[ns]
duration               float64
item                    object
month                   object
network                 object
network_type            object
dtype: object
[9]
indexdatedurationitemmonthnetworknetwork_type
002014-10-15 06:58:0034.429data2014-11datadata
112014-10-15 06:58:0013.000call2014-11Vodafonemobile
222014-10-15 14:46:0023.000call2014-11Meteormobile
332014-10-15 14:48:004.000call2014-11Tescomobile
442014-10-15 17:27:004.000call2014-11Tescomobile
[11]
month
2014-11    115.823657
2014-12     93.260318
2015-01     88.894141
2015-02    113.301453
2015-03    225.251891
Name: duration, dtype: float64
[10]
month
2014-11    26639.441
2014-12    14641.870
2015-01    18223.299
2015-02    15522.299
2015-03    22750.441
Name: duration, dtype: float64
[12]
<matplotlib.axes._subplots.AxesSubplot at 0x21fb6692f88>
[13]
<matplotlib.axes._subplots.AxesSubplot at 0x21fb886d088>
[14]
<matplotlib.axes._subplots.AxesSubplot at 0x21fb77c2748>
[15]
<matplotlib.axes._subplots.AxesSubplot at 0x21fb8936c08>
[17]
month    item
2014-11  call    107
         data     29
         sms      94
2014-12  call     79
         data     30
         sms      48
2015-01  call     88
         data     31
         sms      86
2015-02  call     67
         data     31
         sms      39
2015-03  call     47
         data     29
         sms      25
Name: duration, dtype: int64
[18]
itemcalldatasms
month
2014-111072994
2014-12793048
2015-01883186
2015-02673139
2015-03472925
[19]
<matplotlib.axes._subplots.AxesSubplot at 0x21fb8b3be08>
[21]
indexdatedurationitemmonthnetworknetwork_type
002014-10-15 06:58:0034.429data2014-11datadata
112014-10-15 06:58:0013.000call2014-11Vodafonemobile
222014-10-15 14:46:0023.000call2014-11Meteormobile
332014-10-15 14:48:004.000call2014-11Tescomobile
442014-10-15 17:27:004.000call2014-11Tescomobile
[20]
monthduration
02014-1126639.441
12014-1214641.870
22015-0118223.299
32015-0215522.299
42015-0322750.441
[22]
durationnetwork_typedate
monthitem
2014-11call25547.0001072014-10-15 06:58:00
data998.441292014-10-15 06:58:00
sms94.000942014-10-16 22:18:00
2014-12call13561.000792014-11-14 17:24:00
data1032.870302014-11-13 06:58:00
sms48.000482014-11-14 17:28:00
2015-01call17070.000882014-12-15 20:03:00
data1067.299312014-12-13 06:58:00
sms86.000862014-12-15 19:56:00
2015-02call14416.000672015-01-15 10:36:00
data1067.299312015-01-13 06:58:00
sms39.000392015-01-15 12:23:00
2015-03call21727.000472015-02-12 20:15:00
data998.441292015-02-13 06:58:00
sms25.000252015-02-19 18:46:00
[23]
durationnetwork_typedate
mincountminfirstnunique
monthitem
2014-11call1.0001072014-10-15 06:58:002014-10-15 06:58:00104
data34.429292014-10-15 06:58:002014-10-15 06:58:0029
sms1.000942014-10-16 22:18:002014-10-16 22:18:0079
2014-12call2.000792014-11-14 17:24:002014-11-14 17:24:0076
data34.429302014-11-13 06:58:002014-11-13 06:58:0030
sms1.000482014-11-14 17:28:002014-11-14 17:28:0041
2015-01call2.000882014-12-15 20:03:002014-12-15 20:03:0084
data34.429312014-12-13 06:58:002014-12-13 06:58:0031
sms1.000862014-12-15 19:56:002014-12-15 19:56:0058
2015-02call1.000672015-01-15 10:36:002015-01-15 10:36:0067
data34.429312015-01-13 06:58:002015-01-13 06:58:0031
sms1.000392015-01-15 12:23:002015-01-15 12:23:0027
2015-03call2.000472015-02-12 20:15:002015-02-12 20:15:0047
data34.429292015-02-13 06:58:002015-02-13 06:58:0029
sms1.000252015-02-19 18:46:002015-02-19 18:46:0017
[26]
duration
minmaxmean
month
2014-111.01940.0115.823657
2014-121.02120.093.260318
2015-011.01859.088.894141
2015-021.01863.0113.301453
2015-031.010528.0225.251891
[28]
minmaxmean
month
2014-111.01940.0115.823657
2014-121.02120.093.260318
2015-011.01859.088.894141
2015-021.01863.0113.301453
2015-031.010528.0225.251891
[29]
min_durationmax_durationmean_duration
month
2014-111.01940.0115.823657
2014-121.02120.093.260318
2015-011.01859.088.894141
2015-021.01863.0113.301453
2015-031.010528.0225.251891
[30]
duration_minduration_maxduration_mean
month
2014-111.01940.0115.823657
2014-121.02120.093.260318
2015-011.01859.088.894141
2015-021.01863.0113.301453
2015-031.010528.0225.251891

Pivot table Crosstab

pivot은 엑셀이 있는 거라고 함

- Index 축은 groupby와 동일함

- Column에 추가로 labeling 값을 추가하여,

- Value에 numeric type 값을 aggregation 하는 형태

[32]
indexdatedurationitemmonthnetworknetwork_type
002014-10-15 06:58:0034.429data2014-11datadata
112014-10-15 06:58:0013.000call2014-11Vodafonemobile
222014-10-15 14:46:0023.000call2014-11Meteormobile
332014-10-15 14:48:004.000call2014-11Tescomobile
442014-10-15 17:27:004.000call2014-11Tescomobile
[33]
duration
networkMeteorTescoThreeVodafonedatalandlinespecialvoicemailworld
monthitem
2014-11call152140451245843160.000290603010
data0000998.4410000
sms10325550.0000100
2014-12call20101819631613020.000142406900
data00001032.8700000
sms12113180.0000004
2015-01call22072904644536260.000160302850
data00001067.2990000
sms10333400.0000000
2015-02call11884087627918640.00073002680
data00001067.2990000
sms1211230.0000200
2015-03call274973496635130.0001177002310
data0000998.4410000
sms045130.0000003
[34]
networkMeteorTescoThreeVodafonedatalandlinespecialvoicemailworld
monthitem
2014-11call1521.04045.012458.04316.0NaN2906.0NaN301.0NaN
dataNaNNaNNaNNaN998.441NaNNaNNaNNaN
sms10.03.025.055.0NaNNaN1.0NaNNaN
2014-12call2010.01819.06316.01302.0NaN1424.0NaN690.0NaN
dataNaNNaNNaNNaN1032.870NaNNaNNaNNaN
sms12.01.013.018.0NaNNaNNaNNaN4.0
2015-01call2207.02904.06445.03626.0NaN1603.0NaN285.0NaN
dataNaNNaNNaNNaN1067.299NaNNaNNaNNaN
sms10.03.033.040.0NaNNaNNaNNaNNaN
2015-02call1188.04087.06279.01864.0NaN730.0NaN268.0NaN
dataNaNNaNNaNNaN1067.299NaNNaNNaNNaN
sms1.02.011.023.0NaNNaN2.0NaNNaN
2015-03call274.0973.04966.03513.0NaN11770.0NaN231.0NaN
dataNaNNaNNaNNaN998.441NaNNaNNaNNaN
smsNaN4.05.013.0NaNNaNNaNNaN3.0


crosstab

- 특히 두 칼럼에 교차 빈도, 비율, 덧셈 등을 구할 때 사용

- Pivot table의 특수한 형태

- User-Item Rating Matrix 등을 만들 때 사용가능함


df_movie = pd.read_csv("data/movie_rating.csv")
df_movie.head()
critictitlerating
0Jack MatthewsLady in the Water3.0
1Jack MatthewsSnakes on a Plane4.0
2Jack MatthewsYou Me and Dupree3.5
3Jack MatthewsSuperman Returns5.0
4Jack MatthewsThe Night Listener3.0


df_movie.pivot_table(
    ["rating"],
    index=df_movie.critic,
    columns=df_movie.title,
    aggfunc="sum",
    fill_value=0,
)
rating
titleJust My LuckLady in the WaterSnakes on a PlaneSuperman ReturnsThe Night ListenerYou Me and Dupree
critic
Claudia Puig3.00.03.54.04.52.5
Gene Seymour1.53.03.55.03.03.5
Jack Matthews0.03.04.05.03.03.5
Lisa Rose3.02.53.53.53.02.5
Mick LaSalle2.03.04.03.03.02.0
Toby0.00.04.54.00.01.0


pd.crosstab(
    index=df_movie.critic,
    columns=df_movie.title,
    values=df_movie.rating,
    aggfunc="first",
).fillna(0)
titleJust My LuckLady in the WaterSnakes on a PlaneSuperman ReturnsThe Night ListenerYou Me and Dupree
critic
Claudia Puig3.00.03.54.04.52.5
Gene Seymour1.53.03.55.03.03.5
Jack Matthews0.03.04.05.03.03.5
Lisa Rose3.02.53.53.53.02.5
Mick LaSalle2.03.04.03.03.02.0
Toby0.00.04.54.00.01.0


df_movie.groupby(["critic", "title"]).agg({"rating": "first"})
rating
critictitle
Claudia PuigJust My Luck3.0
Snakes on a Plane3.5
Superman Returns4.0
The Night Listener4.5
You Me and Dupree2.5
Gene SeymourJust My Luck1.5
Lady in the Water3.0
Snakes on a Plane3.5
Superman Returns5.0
The Night Listener3.0
You Me and Dupree3.5
Jack MatthewsLady in the Water3.0
Snakes on a Plane4.0
Superman Returns5.0
The Night Listener3.0
You Me and Dupree3.5
Lisa RoseJust My Luck3.0
Lady in the Water2.5
Snakes on a Plane3.5
Superman Returns3.5
The Night Listener3.0
You Me and Dupree2.5
Mick LaSalleJust My Luck2.0
Lady in the Water3.0
Snakes on a Plane4.0
Superman Returns3.0
The Night Listener3.0
You Me and Dupree2.0
TobySnakes on a Plane4.5
Superman Returns4.0
You Me and Dupree1.0



Merge & Concat

merge

- SQL에서 많이 사용하는 Merge와 같은 기능

- 두 개의 데이터를 하나로 합침


pd.merge(df_a, df_b, on="subject_id")

pd.merge(df_a, df_b, left_on="subject_id", right_on="subject_id")  # 다른 이름끼리 묶음

pd.merge(df_a, df_b, on="subject_id", how="left")

pd.merge(df_a, df_b, on="subject_id", how="right")

pd.merge(df_a, df_b, on="subject_id", how="outer")

pd.merge(df_a, df_b, on="subject_id", how="inner") # inner가 default
pd.merge(df_a, df_b, right_index=True, left_index=True) # 두 df의 index가 모두 살아있음


df_new = pd.concat([df_a, df_b])
df_new.reset_index()
df_a.append(df_b)
밑으로 이어붙임


df_new = pd.concat([df_a, df_b], axis=1)
df_new.reset_index()
옆으로 이어붙임


persistence

Database connection

- Data loading시 db connection 기능을 제공함

그냥 .db 파일 불러와서 sql문 쓰는거다

import sqlite3 # pymysql 설치

하고싶은거 한 다음에 pd로 dataframe으로.. 아직은 가능하다 정도만


conn = sqlite3.connect("./data/flights.db")
cur = conn.cursor()
cur.execute("select * from airlines limit 5;")
results = cur.fetchall()

df_airplines = pd.read_sql_query("select * from airlines;", conn)

df_airports = pd.read_sql_query("select * from airports;", conn)

df_routes = pd.read_sql_query("select * from routes;", conn)





XLS persistence

- Dataframe의 엑셀 추출 코드

- Xls 엔진으로 openpyxls 또는 XlsxWrite 사용

엑셀파일로도 쓸 수 있다.

conda install openpyxl 이나 conda install XlsxWriter 깔아야함


writer = pd.ExcelWriter("./data/df_routes.xlsx", engine="xlsxwriter")
df_routes.to_excel(writer, sheet_name="Sheet1")

df_routes.to_pickle("./data/df_routes.pickle")

df_routes_pickle = pd.read_pickle("./data/df_routes.pickle")
df_routes_pickle.head()
df_routes_pickle.describe()



확률론 맛보기

딥러닝의 기본 바탕이되는 확률론에 대해 소개합니다.

확률분포, 조건부확률, 기대값의 개념과 몬테카를로 샘플링 방법을 설명합니다.

데이터의 초상화로써 확률분포가 가지는 의미와 이에 따라 분류될 수 있는 이산확률변수, 연속확률변수의 차이점에 대해 설명합니다.

확률변수, 조건부확률, 기대값 등은 확률론의 매우 기초적인 내용이며 이를 정확히 이해하셔야 바로 다음 강의에서 배우실 통계학으로 이어질 수 있습니다. 기대값을 계산하는 방법, 특히 확률분포를 모를 때 몬테카를로 방법을 통해 기댓값을 계산하는 방법 등은 머신러닝에서 매우 빈번하게 사용되므로 충분히 공부하시고 넘어가시기 바랍니다.


에측이란 것은 예측의 오차의 분산을 최소화하는 목적 이다.


왜 필요한가

- 딜버닝은 확률론 기반의 기계학습 이론에 바탕을 두고 있다.

- 기계학습에서 사용되는 손실함수(loss function)들의 작동 원리는 데이터 공간을 통계적으로 해석해서 유도하게된다

- 회귀 분석에서 손실함수로 사용되는 L2-노름은 예측오차의 분산을 가장 최소화하는 방향으로 학습하도록 유도한다

- 분류 문제에서 사용되는 교차엔트로피(cross-entropy)는 모델 예측의 불확실성을 최소화하는 방향으로 학습하도록 유도한다

- 분산 및 불확실성을 최소화하기 위해서는 측정하는 방법을 알아야 한다


데이터는 확률변수로 (x,y) ~ D 라 표기

확률변수는 확률분포 D에 따라 이산형(discrete)과 연속형(continuous) 확률변수로 구분하게 된다. 시그마랑 적분으로 나뉜다고



점들의 개수에 따른 확률분포. 주변확률분포. 걍 X 구간 안에 있는 모든 y개를 더하고(또는 적분) 나온 결과.
데이터 수가 discrete 해도 연속으로 해볼 수 있고, 연속이어도 discrete로 해볼 수도 있다. 이는 모델링 방법에 따라서 결정

위에서 했던걸 Y=1 구간일때만, Y=2 구간일때만 구해서 조건부확률 구하기 가능

조건부확률분포 P(X|y) 는 데이터 공간에서 입력 X와 출력 y 사이의 관계를 모델링합니다.

조건부확률로 안다는게 y가 1인 경우는 x가 어디 부근일때더라, x가 2이상인 경우엔 y=2가 많다더라~ 라는 식으로 안다는 거고. 저건 여러 데이터들을 discrete로 접근할 수 있다는 걸 알려주는 듯. 저렇게 크기를 정의해 놔야 분석을 하든 뭘 하든 할 수 있으니. 전 시간에 배웠던 거에선 저 데이터 다 계산해서 행렬로 푼 방법들 연립방적식이나 선형회귀분석으로 풀거나 경사하강법을 그것도 일부만 빼내서 확률적 경사하강법을 쓰던지 할 텐데, 조건부 확률을 사용하는 식으로 확률적으로 접근해서 풀기도 한다. 결국 모두 목적은 입력값 X와 출력값 y 사이의 관계를 모델링 한다. 즉 weight를 알아낸다고.



자꾸 회귀회귀 하는데 회귀가 뭔뜻이야 => https://brunch.co.kr/@gimmesilver/17


조건부확률분포 P(X|y) 는 입력변수 x가 주어졌을때 정답인 확률 y를 의미.

분류문제에서 softmax(Wpi + b)는 데이터 x로부터 추출된 특징패턴 pi(x)와 가중치행렬 W를 통해 조건부확률 P(y|X)를 계산한다. 즉 내가 구하고 싶은게 P(y|X) 이고 분류문제에선 softmax(Wpi + b) 를 이용해서 구할 수 있다는걸 뜻하는것 같다.

회귀 문제의 경우 보통 연속확률분포라 확률밀도함수로 조건부기대값 E[y|X] 을 추정한다. 근데 왜 쓰냐. 조건부기대값은 L2를 최소화하는 함수와 일치하더라. 걍 수학적으로 증명돼있다. 예측의 오차의 분산을 최소화하는 목적에 적절함.



기대값 뭔지 알지? 이걸 이용해 분산, 첨도, 공분산등 여러 통계량 계산 가능 그래서 기대값은 굉장히 중요한 통계량이면서 도구다.






위에처럼 데이터가 몇개 없고 간단할 때는 점을 찍어서 표시하는 것 처럼 해도 되지만 실제 데이터는 수십억개니까 입력/결과 입력/결과 입력/결과 ... 식으로 여러개 찍어보고 확률분포가 어떤식으로 일어나는지 확인하는 것 같다.
i.i.d가 뭔가요?? 도 https://brunch.co.kr/@gimmesilver/17

그냥 싹 다 더해서 구한 것 같다. 넓이의 정의가 저거니까..

딥러닝은 다층신경망(MLP)을 이용하여 데이터로부터 특징패턴 pi를 추출한 후에 조건부확률을 계산하거나 조건부기대값을 추정하는 식으로 학습을 하게된다.

그래서 특징패턴을 학습하기 위해서 목적으로 주어진 손실함수를 사용할 지에 대해서는 기계학습의 문제와 모델에 의해 결정된다.

기계학습은 명시적으로 확률분포를 모를때가 많다. 그래서 몬테카를로 샘플링 방식으로 데이터를 이용해서 우회적으로 계산한다. 반복적으로 구하면 분산도 구할 수 있어서 오차범위도 계산 가능하다. 근데 데이터로 추정하는거라 수가 너무 적거나 하면 오차범위가 너무 넓어짐.. 


======================

퀴즈

연속형 확률변수의 한 지점에서의 밀도 (density) 는 그 자체로 확률값을 가진다. 아님. 회귀 문제의 경우 조건부기대값으로 추정하는듯. 주어진 함수에다가 확률밀도함수를 곱해서 적분. 해서 구한게 조건부기대값


======================

피어세션

소프트맥스 이름의 유래. 하드하게 나누는게 아닌 부드럽게..

다 손으로 6 쓰는게 다르니까 이것이 6일 확률이 높다.

소프트맥스 e쓰는 이유. 미분이 편리. 무리수다보니 하드한 값이 안나오고 소프트한 값이 나옴. 확률적인 값을 통해 확장된 모델에서 분류가 된다.

학습할 땐 당연히 써야한다. 원래 확률이 아닌데 확률처럼 쓴다. 그래서 분류하기에 적절해서 소프트맥스에 쓰기에 적절하고 사용한다. 0.9가 나왔다고 0.9% 가 아니고


logistic function이 어떻게 나오는지. activate function을 어떤걸 쓰는건지.

vanishing gradient. sigmoid들 이해하고 보면 수식 이해하는데 간단해짐

sigmoid단점. 매우크면 1, 매우 작으면 0에 가까워져서 학습에 힘들어서 잘 안써짐. 그래서 reLU 나 riky reLU를 쓴다. 중간에 relu써도 마지막은 구별만 하면 되니까 logistic을 써도 상관없겠다.


선형모델. 비선형모델. 선형모델은 xor 분류 불가능. 비선형으로 바꿔야함. 가능하게 하는게 활성함수. sigmoid, tanh, reLU. 학습 속도가 reLU에 비해 많이 떨어져서 reLU쓴다. 반복이 되서 층층이 쌓이면 mlp. 역전파는 반복해서 들어가야 하는데 각 노드마다 tensor를 저장해야함. 그래서 메모리를 많이 잡아먹는다. 각 연산 결과를 메모리에 일일이 저장해야 해서. 레이어마다 입력값을 메모리에 저장해야 된다.


왜 층이 깊어질수록 파라미터가 적어서 효율적인게 가능하다. 근데 모델 학습에 어렵다. 안깊으면 넓어서 힘들다. 연쇄학습에 필요한게 역전파 알고리즘이다.


생각해야겠다 신경쓴게 층이 깊어질수록 정말 효율적인 건가 고려해야 할 것 같음. 깊게 안하고 얇게 하려면 깊게 안한 만큼 더 엄청 많이 학습해야하는것 같음.


비선형끼리 합쳐서 선형처럼 만든다는게 신기했음.


NH계열 초봉 5000. 직급 5~6급. 농협 최고다. 카카오 엔터프라이즈. 일하기가 굉장해 좋다. 자유롭고 AI담당. 브레인. 엔터프라이즈. 주로 기업용 솔루션. 카카오워크. 카카오aws


=======================

후기

설명이 좀 어려운것 같다. ppt에다 이해를 위한 개념을 적어주셨으면 좋겠다. 아니면 내가 새벌식 타자를 익히고 말 다 적어서 요약하는 것도 좋을 것 같다.

피어세션보니 다들 정말 깊게 파고들며 공부하는 것 같다. 나도 남들이 하는 질문 보면서 탐구해보는 시간이 필요한 것 같다.

댓글 없음:

댓글 쓰기