Naver Ai Boostcamp

[DAY 8] Pandas I / 딥러닝 학습방법 이해하기

잡담연구소 2021. 1. 27. 23:57

살다보면 가끔 그런 날이 있다. 평소에 자주 쓰던, 익히 알고있다고 생각하던 단어들이 갑자기 낯설어지는 그런 날

오늘이 딱 그랬다. 선형회귀, 등등 잘 알고있다고 생각했는데, 갑자기 이게 왜? 예시가 없나? 왜 이렇게 되지? 라는 의문이 계속 드는 그런 날이었다. 

Pandas

📌 Series

  • dataframe 중 하나의 column에 해당하는 데이터의 모음 object
  • numpy와의 가장 큰 차이점 : 인덱스 값을 지정해줄 수 있다.
    - default 값은 0부터 시작하는 숫자지만 따로 인덱스를 지정해줄 수 있다. value들의 데이터타입은 기본적으로 nd.array 
list_data = [1, 2, 3, 4, 5]
example_obj = Series(data=list_data)
example_obj

# 0    1
# 1    2
# 2    3
# 3    4
# 4    5
# dtype: int64

list_data = [1, 2, 3, 4, 5]
list_name = ["a", "b", "c", "d", "e"]
example_obj = Series(data=list_data, index=list_name)
example_obj

# a    1
# b    2
# c    3
# d    4
# e    5
# dtype: int64
  • data , index 등의 kwargs를 주면 시리즈의 이름, 인덱스의 이름을 따로 지정해줄 수 있다. (but 자주 안 씀)
  • 시리즈는 인덱스를 기준으로 생성된다. 
dict_data_1 = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
indexes = ["a", "b", "c", "d", "e", "f", "g", "h"]
series_obj_1 = Series(dict_data_1, index=indexes)
series_obj_1

# a    1.0
# b    2.0
# c    3.0
# d    4.0
# e    5.0
# f    NaN
# g    NaN
# h    NaN
# dtype: float64

 

📌 DataFrame

  • series와는 다르게 값에 접근하기위해선느 column명과 index모두 알아야된다. 
    각 column별로 데이터type이 다를 수 있다. (하나의 column은 데이터 type 같아야함 )
  • column을 선택해 series를 추출하는 방법 두가지!
df.first_name

#0    Jason
#1    Molly
#2     Tina
#3     Jake
#4      Amy
#Name: first_name, dtype: object

df["first_name"]

#0    Jason
#1    Molly
#2     Tina
#3     Jake
#4      Amy
#Name: first_name, dtype: object
  • Dataframe indexing : loc ,  iloc
    - loc : index의 이름 
    - iloc : index의 넘버 
    - 이거 처음배울 때 굉장히 재밌는 개념이었는데, loc 사용하는 게 너무 헷갈려 나는 주로 iloc를 썼던 거 같다.
s = pd.Series(np.nan, index=[49, 48, 47, 46, 45, 1, 2, 3, 4, 5])
s.loc[:3]

#49   NaN
#48   NaN
#47   NaN
#46   NaN
#45   NaN
#1    NaN
#2    NaN
#3    NaN
#dtype: float64

s.iloc[:3]
#49   NaN
#48   NaN
#47   NaN
#dtype: float64

이렇게 인덱스의 번호와 이름이 상이할 때는 loc와 iloc가 헷갈리지 않지만, 같을 때는 좀 헷갈린다. 
- iloc는 이름을 보는 거므로 .loc하면 인덱스가 3인값 까지 나오지만 

- loc는 넘버를 보는거므로 .iloc하면 인덱스가 3인 값 이전까지 나온다. (포함x)

 

  • column에 새로운 데이터 할당하기 
    - df의 age column에서 40보다 큰 조건을 만족시키는 행에 대해서는 true , false가 뜨는 debt column 생성
df.debt = df.age > 40
df

#	first_name	last_name	age	city	debt
# 0	Jason	Miller	42	San Francisco	True
# 1 	Molly	Jacobson	52	Baltimore	True
# 2	Tina	Ali	36	Miami	False
# 3	Jake	Milner	24	Douglas	False
# 4	Amy	Cooze	73	Boston	True

❗ pandas 에서 엑셀을 사용하기 위해서는 xlrd라는 모듈을 사용해야된다. 

 

  • df["컬럼명"] vs df[["컬럼명"]]
    - df 내 컬럼명을 바로 주게 되면 sereis가 출력된다. 
    column을 select 해 dataframe으로 사용/출력하고싶다면 리스트 안에 넣어서 전달해줘야된다. 

  • df.rest_index() : index가 새로 하나 더 생김 

  • data drop : df.drop(인덱스넘버) 
    - 행,열을 drop시킨 상태로 df를 변화시키고 싶다면 inplac = True 를 인자로 주자. 
    - axis 기준으로 삭제할 수 있다. -> 행/열 모두 용이하게 삭제 

📌 DataFrame operation

  • add 와 같은 사칙연산 : index를 기준으로 연산수행, 겹치는 index가 없을 경우 NaN값으로 반환
    - NaN값에 대해서 fill_value 를 사용하여 원하는 값으로 채워준다 -> 주로 결측치 볼 때
  • series + dataframe : axis를 기준으로 row broadcationg이 발생 

📌 map for series 

  • series type의 데이터에도 map 함수를 사용할 수 있다
s1 = Series(np.arange(5))
s1.map(lambda x : x**2).head()

# 0     0
# 1     1
# 2     4
# 3     9
# 4    16
# dtype: int64
  • map이 아닌 dict type으로 데이터 교체도 가능하다.  
z = {1: "A", 2: "B", 3: "C"}
s1.map(z)

# 0    NaN
# 1      A
# 2      B
# 3      C
# 4    NaN
# 5    NaN
# 6    NaN
# 7    NaN
# 8    NaN
# 9    NaN
# dtype: object
  • 내장 연산 함수를 사용할때도 컬럼별로 똑같은 효과
df_info.apply(np.mean)

#earn      32446.292622
#height       66.592640
#age          45.328499

df_info.mean()

#earn      32446.292622
#height       66.592640
#age          45
  • applymap
f = lambda x: x // 2
df_info.applymap(f).head(5)


# earn	height	age
# 0	39785.0	36.0	24
# 1	48198.0	33.0	31
# 2	24355.0	31.0	16
# 3	40239.0	31.0	47
# 4	41044.0	31.0	21

📌built-in fuction

  • describe : 데이터의 요약 정보(기술통계값들)
  • unique : series 내 유일하게 가지는 값들을 반환해줌 (set 같은 느낌, sex라면 male, female만 나오듯)
  • isnull : NaN값의 index를 반환함 
    - sum 사용 시 , Null인 값의 합 
  • sort_values : column값 기준 sorting 
  • corr , cov : 상관계수와 공분산을 구하는 함수 
    - corr : 두 컬럼의 상관계수를 구하는 거고 corrwith는 하나의 컬럼과 데이터 프레임 내 나머지 컬럼들과의 상관계수를 구하는 내장함수

 

❓❔활성화 함수를 사용하지 않으면 선형모델과 차이가 없다. 왜?

1. 선형과 비선형 

블로그를 참고했다. 선형이라는 뜻은 아래 3개를 모두 충족시키면 선형성이라고 한다.

1 ) 선형적인 그래프 : 중학생 때 배우는 일차함수의 그래프를 의미한다.

2 ) 동차성 :f(ax) = a*f(x)

3 ) 가산성 : f(x1 + x2) = f(x1) + f(x2)

 

ReLU는 왜 비선형함수일까?

1 ) 선형그래프가 아니다. 

정의역을 [0,INF]식으로 잘라보면다면 선형그래프일지 몰라도 전체 실수공간에 대해 선형적이지 못하다.

 

2 ) 동차성을 만족하지 못한다.

a = -1 , x = 1 이라하면

f(ax) = f(-1) = 0 이지만 af(x) = -f(1) = -1로 동차성을 만족하지 못한다.

 

3) 가산성을 만족하지 못한다. 

x1 = 1 , x2 = -2라 하면 

f(x1 + x2) = f(-1) = 0이지만 f(x1) + f(x2) = 1 + 0 =1 로 가산성을 만족하지 못한다. 

 

2. 활성함수를 사용하지 않으면 선형모델과 차이가 없는 이유

대부분의 활성함수 sigmoid , tanh , relu 등은 비선형함수들이다.

만약 hidden layer가 2개 존재하며 

첫번째 레이어는 f(x) = ax  , 두번째 레이어는 g(x) = bx라고 하면 레이어 두개를 다 거친 output은 g(f(x))로 ba * x 로 레이어를 한 번 취한 것과 같게 된다.

결국 비선형성이 없다면 레이어를 아무리 아무리 쌓아도 그냥 1개의 선형변환이 된다는 것이다. 

 

 3. 비선형이 중요한 이유 

선형만으로는 XOR문제를 풀 수 없다. 직선 하나로 공간을 4개로 분할할 수 없기 떄문이다. 

그렇기 때문에 비선형 레이어가 필요한 것이다. 

그래서 레이어를 깊게 쌓아 비선형을 더해줄 수록 decsion boundary가 더욱 많아져 더 잘 분류할 수 있게 되는 거 같다.

 

 

 

 

피어세션 

- 피어세션이 피어씁니다 ^_____^ 를 준비하면서 잘 몰랐던 조원들의 모습에 대해서 알게되었다. 

  유진님은 공부하기 싫으면 헬스를 하시고, 보현님은 수영을 하시고 , 보윤님은 음주가무에 능한 흥부자였다,,,,,,!

  서로의 장점도 같이 얘기하면서 친해진 거 같다. 

  성훈님은 항상 성실하셔서 매일 학교에 가고, 줌에도 1등으로 오신다. 

  희준님은 센스 있어서 항상 말씀이나 행동을 재밌게 하신다. 요새 내 배꼽도둑 1위ㅠ

  보현님은 질문을 하실 때 눈이 엄청 반짝 반짝 빛난다. 더 잘 알려주고싶다해야되나,,,, ? 좋은 에너지다.

  보윤님은 이것 저것 많이 하셔서 잘 안쉬실 줄 알았는데 술 + 노래 + 춤을 다 좋아하는 끼부자 흥부자,,,,
  역시 공부 잘하는 사람들이 노는 것도 잘하는 거 같다. 

  유진님은 공부하기 싫을 때 헬스를 하신다는 게 너무 대단하다,,,, 난 유튜브 보는데 어떻게 그러시지

 

  어쩌다가 두 번 풀었다,,,, 로직이 잘못됐나? 해서 다르게 풀었는데 8방향 부호 하나 잘못써서 그랬던 거였음 ^^...

from collections import deque

n,m = map(int,input().split())
shark = []

for i in range(n):
        shark.append(list(map(int, input().split())))

dx = [1,1,1,-1,-1,-1,0,0]
dy = [0,1,-1,0,1,-1,1,-1]

def bfs(s_x,s_y):
    visited = [[0 for _ in range(m)] for _ in range(n)] 
    q = deque([[s_x,s_y]])
    visited[s_x][s_y] = 1
    while q: 
        x ,y = q.popleft()
        if (shark[x][y] == 1) : 
          return visited[x][y] - 1
        for i in range(8):
            nx = x + dx[i]
            ny = y + dy[i]
            if (-1< nx < n and -1 < ny < m and not visited[nx][ny]):
                visited[nx][ny] = visited[x][y] + 1
                q.append([nx,ny])

nmax = 0        
for i in range(n) :
    for j in range(m):
        if not shark[i][j]:
          nmax = max(nmax, bfs(i,j))

print(nmax)
from collections import deque

dx = [1,1,1,-1,-1,-1,0,0]
dy = [0,1,-1,0,1,-1,1,-1]

n,m = map(int,input().split())

q = deque()
visited = [[0 for _ in range(m)] for _ in range(n)] 
shark = []

for i in range(n):
    shark.append(list(map(int, input().split())))

def where_shark():
    for i in range(n):
        for j in range(m) :
          if shark[i][j] : 
            q.append([i,j])
            visited[i][j] = 1
def check(x,y):
    return (-1< x < n and -1 < y < m and not visited[x][y] and not shark[x][y])

def bfs():
    nmax = 0
    while q: 
        x, y = q.popleft()
        for i in range(8):
            nx = x + dx[i]
            ny = y + dy[i]
            if check(nx,ny):
                  visited[nx][ny] = visited[x][y] + 1
                  nmax = max(nmax ,visited[nx][ny])
                  q.append([nx,ny])
    return nmax

where_shark()
print(bfs()-1)

 

from collections import deque

dx = [-2,-2,0,0,2,2]
dy = [-1,1,-2,2,-1,1]

n = int(input())
start_x, start_y , end_x , end_y = map(int,input().split())
q = deque([[start_x,start_y]])

visited = [[0 for _ in range(n)] for _ in range(n)] 
visited[start_x][start_y]= 1
answer = 0

def bfs(ex, ey):
  while q: 
    x, y = q.popleft()
    if (x == ex and y == ey) :
      return visited[ex][ey] -1
    for i in range(6):
      nx = x + dx[i]
      ny = y + dy[i]
      if -1< nx <n and -1< ny <n and not visited[nx][ny]:
        visited[nx][ny] = visited[x][y] + 1
        q.append([nx,ny])

answer = bfs(end_x, end_y) 
if answer : print(answer)
else : print(-1)

 

 

 

'Naver Ai Boostcamp' 카테고리의 다른 글

[DAY 10] 시각화 / 통계학  (0) 2021.01.30
[DAY 9] Pandas II / 확률론  (0) 2021.01.29
[DAY 7] 경사하강법  (0) 2021.01.26
[DAY 6] Numpy / 벡터 / 행렬  (0) 2021.01.26
[DAY 5] 파이썬으로 데이터 다루기  (0) 2021.01.23