반응형
Notice
Recent Posts
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Today
Total
관리 메뉴

오식랜드

데이터 사이언스 본문

dev-log/cs

데이터 사이언스

개발하는 오식이 2024. 4. 26. 14:46
반응형

머신러닝

기초

알고리즘 : 문제 해결을 위한 절차나 방법

머신러닝 : 기계가 패턴을 학습하여 자동화하는 알고리즘

  • 지도학습 : 문제와 답을 함께 학습
    • 회귀 (연속형) : y 특징 찾아 데이터 x 이용해 y 예측 (ex. 키, 몸무게)
    • 분류 (이산형) : dog or cat
  • 비지도학습 : 컴퓨터 스스로 학습
    • 군집 (클러스터) : 모델이 스스로 분류 기준을 찾아 집단 구분

⇒ 실제 답(ground truth)인 y의 존재 여부에 따라 학습 방법 구분

기본 모형 (model) : y = f(x)

ex) 키를 이용해 몸무게 예측? y=f(x)라는 머신러닝 모델을 통해 예측 할 수 있다

통계 붙석 및 전처리 라이브러리

  • 넘파이 (Numpy) : 선형대수 계산식을 파이썬으로 구현
  • 판다스 (Pandas) : 넘파이 기반, 사실상 표준 라이브러리 (데이터 전처리, 통계, 엑셀, 피봇 테이블 등)
  • 사이파이 (Scipy) : 넘파이 기반, 거의 모든 수학 연산
  • 매트플롯립 (Matplotlib) : 대중적 그래프 생성 라이브러리

데이터 명칭

  • 데이터 테이블 (data table) : 데이터 표
  • 독립 변수 x (feature) : 종속변수 y에 영향을 주는 특성
  • = 열 이름 (column name)
  • 데이터 인스턴스 (data instance)
    • 데이터 1개 묶음
    • 튜플(tuple)
    • 엑셀 1줄 (행)

  • 연속형 데이터 (숫자형 데이터)
    • 온도, 키, 몸무게 등
    • 값이 끊어지지 않음 (값 a와 b사이 무한한 수 존재 가능
  • 이산형 데이터 (명목형 데이터)
    • 성별, 주소, 설문조사 척도
    • 값이 라벨의 역할 수행
    • 숫자의 의미가 없음

⇒ 숫자의 의미가 스케일(scale)이 있는가, 없는가로 구분

⇒ scale : *10, *100을 해도 의미가 있는가 없는가


  • 숫자형 데이터
    • 등간 척도형 : 단위(m)
    • 비율 척도형 : 데이터와 비율
    • 정량적 측정, 정수나 실수 값
  • 명목형 데이터
    • 카테고리로 분류 가능
    • 명목 척도
  • 서수형 데이터
    • 범주형 데이터 + 데이터 간 순서 존재
    • 대 / 중 / 소
    • 비례하지는 않음

차원의 저주

  • feature 개수가 크게 증가 → 차원 증가 → 표현 불가
  • 희박한 벡터 생성 (sparse vector) : 벡터 공간에 0이 너무 많이 포함된 상태 → 정확도 떨어짐
  • 데이터 처리 속도 감소 / 메모리 공간 많이 차지 → 샘플 데이터가 많아져 발생

NumPy

  • 사실상 표준 라이브러리
  • 선형대수 표현법을 코드로 처리 (벡터, 행렬)
  • 다차원 리스트 등 크기가 큰 데이터 처리에 유리
  • 속도가 빠르고 메모리 사용 효율적
  • 반복문X 병렬로 처리O

텐서

: 선형대수의 데이터 배열

랭크(Rank) 이름

0 스칼라
1 벡터
2 행렬
3, … , n n차원 텐서

함수

tensor_rank3 = [[[1, 2, 5, 8], [1, 2, 5, 8], [1, 2,
5, 8]], [[1, 2, 5, 8], [1, 2, 5, 8], [1, 2, 5, 8]],
[[1, 2, 5, 8], [1, 2, 5, 8], [1, 2, 5, 8]],[[1, 2,
5, 8], [1, 2, 5, 8], [1, 2, 5, 8]] ]

np.array(tensor_rank3, int).ndim  ==> 3 : RANK 출력

np.array(tensor_rank3, int).size  ==> 48 : 원소 총 갯수

np.array( [[1, 2, 3.5], [4, 5, 6.5]], dtype=float)  
==> data type 변경 
==> [[1., 2., 3.5], [4., 5., 6.5]] 로 변경
  • ndim : rank 출력
  • size : 원소 총 갯수 출력
  • dtype / type : 데이터 타입 변경
x = np.array([[1, 2, 5, 8], [1, 2, 5, 8]])
x.shape ==> (2, 4)

x.reshape(-1,) 혹은 x.flatten()
==> 벡터로 바꿔준다
==> array([1, 2, 5, 8, 1, 2, 5, 8])

x = np.array(range(8)).reshape(4,2)
==> array([[0, 1],
						[2, 3],
						[4, 5],
						[6, 7]])
  • reshape : 행렬 크기 변경
  • flatten : 1차원 벡터로 변경

*중요함수

  • diag : 대각성분 값 추출 (k는 시작 인덱스)
  • uniform : 균등분포 함수

슬라이싱 (행, 열)

x = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)
  • x [ : , 2 : ]
  • array([[ 3, 4, 5], [ 8, 9, 10]])
  • x [ 1 , 1 : 3 ]
  • array([7, 8])
  • x [ 1 : 3 ]
  • array([[ 6, 7, 8, 9, 10]])

브로드캐스팅 연산

  • 2x3 텐서와 1개의 스칼라 곱 → 텐서 모든 원소마다 스칼라 값 곱

Pandas

groupby

df.groupby("Team")["Points"].sum()
df.groupby(나누는 기준)[연산 대상].함수()
  • 분할 → 적용 → 결합 과정
  • 대/소문자 구분
  • agg(min) , agg(mean) → agg 함수를 통해 기존 함수 사용
  • transform(max) → 제일 큰 값으로 통일

lambda

lambda x: (x - x.mean()) / x.std()
df.groupby('Team').filter(lambda x: x["Points"].max() > 800)
  • lambda : 함수 → 객체 변환
  • Ʃ0 → NaN : 평균과 자기 자신이 같아서 → 표준편차 : 0

병합

  • 내부 조인 (inner) : 교집합 (Default)
  • 완전 조인 (full) : 합집합
  • 왼쪽 조인 : 왼쪽 그룹 + 교집합
  • 오른쪽 조인 : 오른쪽 그룹 + 교집합
  • 키 값 선택 : on
pd.merge(left=df_left, right=df_right, how="inner", on='subject_id')
pd.merge(left=df_left, right=df_right, left_on='left_id', right_on='right_id')

연결

  • 주로 세로로 데이터 연결
  • concat : 2개 이상을 한번에 합칠 때
  • append : 기존 테이블에 다른 테이블 1개를 붙일 때 (2개씩)

Matplotlib

  • 데이터 시각화 모듈
  • 레이어를 쌓듯이 쌓음
  • plt객체 - figure (그림) 객체 - axes (축) 객체

함수

  • plt.show() : 마지막에 호출해야 출력
  • 축 만들기
    1. add_subplot
    • ax_1 = fig.add_subplot(1, 2, 1) → 1행 2열로 나눈 후 1번
    • ax_2 = fig.add_subplot(1, 2, 2) → 1행 2열로 나눈 후 2번
    1. subplots
    • fig, ax = plt.subplots(nrows=1, ncols=2)
    • fig, ax = plt.subplots(2, 2)
    ⇒ type(ax) → numpy.ndarray : 축 객체는 넘파이 배열 타입으로 생성

집합 표현법

  1. 원소 나열법 : {1, 2, 3, 4, 5}
  2. → a = [1, 2, 3, 4, 5]
  3. 조건 제시법 : { x | x는 12의 약수 }
  4. → a = [ x for x in range(1, 13) if 12 %x == 0 ]

산점도

데이터 분포도를 2차원 평면에 도형으로 표현

막대그래프

# (3) 3개의 막대그래프 생성
plt.bar(X + 0.00, data[0], color = 'b', width = 0.50)
plt.bar(X + 0.50, data[1], color = 'g', width = 0.50)
plt.bar(X + 1.0, data[2], color = 'r', width = 0.50)

# (4) X축에 표시될 이름과 위치 설정
plt.xticks(X+0.50, ("A","B","C", "D"))

누적 막대그래프 (아래서부터 쌓이는 것)

for i in range(3):
plt.bar(X, data[i], bottom = np.sum(data[:i], axis=0), color = color_list[i], label=data_label[i])

히스토그램

  • 데이터 분포 확인
  • bins : x축 구간
  • boxplot : 상자그림
    • 0% -[ 25%(Q1) - 50%(중앙값) - 75%(Q3) ]- 100%
    • boxplot 이외는 “이상치” (outliers) 라고 한다

데이터 전처리 / 정규화

  1. 데이터의 최대값과 최솟값을 0~1 사이 값으로 바꿔준다
  2. 표준 정규분포 형태로 나타낸다

*너무 큰 수 * 너무 작은 수 → round off error

결측치 처리

  1. 삭제 (drop)
    • 데이터가 없는 열이나 행 삭제
    • dropna()
      • 원본 df은 불변
      • inplace=True 쓰면 원본 수정
      • how 파라미터
        • any : 하나의 NaN만 있어도 삭제 (Default)
        • all : 모든 값이 NaN일 때 삭제
  2. 채우기 (fill)
    • 평균값, 최빈값, 중간값 등으로 데이터를 채움
    • fillna()
      • 원본 df은 불변
      • inplace=True 쓰면 원본 수정
      • df["preTestScore"].mean() 와 같이 해당 열의 평균이나 중간값 등으로 채워준다
  • df.isnull().sum() / len(df) : 얼마나 비어있는지 퍼센트로 출력
  • threshfh : 개수를 기준으로 삭제 (thresh=1 → 한 개 이상 존재하면 남기기 (all과 같이 동작))
  • groupby와 함께 사용
  • : 성별로 구분지어 점수를 모두 평균으로 바꿈
df.groupby("sex")["postTestScore"].transform("mean")
df["postTestScore"].fillna(df.groupby("sex")["postTestScore"].transform("mean"), inplace=True)

원핫 인코딩

  • 머신러닝 사용 시 범주별 가능성을 표기하기 위해 사용
  • get_dummies로 구현 가능
    • 대괄호[ ] 차이
    • pd.get_dummies(edges["color"]) pd.get_dummies(edges[["color"]])
    • 1개면 그냥 출력
    • 2개면 새로운 데이터프레임을 생성한것임
  • 정수형 데이터 3,4,5를 M,L,XL로 변경
edges["weight"] = 3, 4, 5

weight_dict = {3:"M", 4:"L", 5:"XL"}
edges["weight_sign"] = edges["weight"].map(weight_dict)
weight_sign = pd.get_dummies(edges["weight_sign"])

바인딩

bins = [0, 25, 50, 75, 100] 
group_names = ['Low', 'Okay', 'Good', 'Great']
categories = pd.cut(df['postTestScore'], bins, labels=group_names)

정규화 : feature normalization

  • 데이터 간 범위 맞추는 것 (브로드캐스팅 개념)
  • 평균을 0으로, 표준편차를 1로
  • 최소값과 최대값 : 0.0~1.0의 범위로

  • z-score 정규화

반응형
Comments