Data Science 2 실기 - 0317

Goodis·2023년 3월 19일
0

DataScience

목록 보기
1/2

1번 문제

단순히 2023-01-12 10:00:00과 같이 생긴 date 열로 year 열을 만들어
year 가 2018 인 column 을 가지고 특정 두 열의 결정 계수 중 절대값이 큰 값
(특정 두 열인지는 기억이 안난다. groupby를 통해 분류 후 진행했을 수도?)

해설

df["date"] = pd.to_datetime(df["date"])
df["year"] = df["date"].dt.year 
 # 혹은 
df["year"] = df["date"].astype("str").slice(0, 4)

df_sub = df.loc[df["year"] == 2018, [columnName1, columnName2]]

df_sub.corr()

2번문제

decisiontreeclassifier 를 사용하여 문제를 푸는 것이였던 걸로 기억한다.
헷갈렸던 부분은 파라미터를 넣을 때 자식 노드가 2개 생길 때 샘플이 8개 미만인 경우는 고려하지 않는다? 이런식으로 주워져서 어떤 값에 넣어야 할지가 헷갈렸다.

파라미터를 정리해보자.!

criterion : string, optional (default=”gini”)
  split 할 특성 선택 알고리즘, 어떤 기준으로 정보 획득량을 계산해 가지를 분리 할 것인지
  'gini': 지니 계수
  'entropy': 엔트로피

max_depth : int or None, optional (default=None)
  얼마나 깊게 트리를 만들어 갈거냐
  None 이면 최대한 깊게 (불순도 혹은 복잡도가 0일 때까지)
  클수록 정확하게 (과대적합)
  작을수록 가지치기 (과대적합 방지)

max_leaf_nodes : int or None, optional (default=None)
  최대 몇개 잎 노드가 만들어 질때 까지 split(하위 (잎) 노드로 분리) 할 것이냐
  클수록 정확하게 (과대적합)
  작을수록 가지치기 (과대적합 방지)

min_samples_split : int, float, optional (default=2)
  샘플이 최소한 몇개 이상이어야 split(하위 (잎) 노드로 분리) 할거냐
  int일 경우 주어진 값을 그대로 사용, float일 경우 0에서 1사이의 값을 줄 수 있으며 전체 데이터 수*min_sample_split의 값을 사용
  클수록 가지치기 (과대적합 방지)
  작을수록 정확하게 (과대적합)

min_samples_leaf : int, float, optional (default=1)
  (잎) 노드가 되려면 가지고 있어야할 최소 샘플 수
  클수록 가지치기 (과대적합 방지)
  작을수록 정확하게 (과대적합)
  
  max_features : int, float, string or None, optional (default=None)
  split(하위 (잎) 노드로 분리) 할때 마다 max_features 개의 특성을 랜덤으로 선택해 그 중 가장 불순도 혹은 복잡도를 작게하는 특성으로 split(하위 (잎) 노드로 분리)

3번문제

vif 를 구하는 문제였는데 모르겠어서 포기했다.

vif를 구하는 api를 문제에서 주워지지 않았던 걸로 기억한다.
(그냥 dmatrices 쓰라고만 했던거 같기도 하고,,)

# api
from patsy import dmatrices
from statsmodels.formula.api import ols
from statsmodels.stats.outliers_influence import variance_inflation_factor
# vif 구하기
y, X = dmatrices("casual ~ temp + atemp + humidity + windspeed", 
                df_model, return_type="dataframe")
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif["feature"]= X.columns

formula 의 형식은
"독립변수 ~ 종속변수1 + 종속변수2 + 종속변수3 + .."

다중공선성이 10 이상인 경우를 제외하고 풀라고 문제가 나왔을 듯하다.


4번문제

왜도를 구하는 문제였다.
오른쪽으로 긴 꼬리일 때 왜도가 가장 큰 값을 구하는 거였던걸로 기억..

왜도(skewness) : 분포의 치우침 정도를 나타내는 정도로, 
좌우 대칭인 경우 0이며 오른쪽 꼬리 분포면 양수

df.skew() 로 왜도를 구할 수 있다.


5번문제

knn 을 쓰는 문제였는데 파라미터를 넣는 부분에서 잘못 집어넣어서 틀린 것 같다.ㅜ
데이터간의 거리를 구할 때는 유클리디안 거리로 구하라고 주어졌는데 weight 을 distance 로 설정해야할 줄 알았는데 아닌 것 같다..

▶ weights : {'uniform', 'distance'} or callable
   예측에 사용되는 가중 방법을 결정한다. default는 uniform이다. 
   'uniform' : 각각의 이웃이 모두 동일한 가중치를 갖는다. 
   'distance' : 거리가 가까울수록 더 높은 가중치를 가져 더 큰 영향을 미치게 된다.
   callable : 사용자가 직접 정의한 함수를 사용할 수도 있다. 거리가 저장된 배열을 입력으로 받고 가중치가 저장된 배열을 반환하는 함수가 되어야 한다. 

▶ algorithm : {'auto', 'ball_tree', 'kd_tree', 'brute'} 
   가장 가까운 이웃들을 계산하는 데 사용하는 알고리즘을 결정한다. default는 auto이다. 
   'auto' : 입력된 훈련 데이터에 기반하여 가장 적절한 알고리즘을 사용한다. 
   'ball_tree' : Ball-Tree 구조를 사용한다.
   'kd_tree' : KD-Tree 구조를 사용한다.
   'brute' : Brute-Force 탐색을 사용한다. 

▶ leaf_size : int
   Ball-Tree나 KD-Tree의 leaf size를 결정한다. default값은 30이다.
   이는 트리를 저장하기 위한 메모리뿐만 아니라, 트리의 구성과 쿼리 처리의 속도에도 영향을 미친다. 

▶ p : int
   민코프스키 미터법(Minkowski)의 차수를 결정한다. 
   예를 들어 p = 1이면 맨해튼 거리(Manhatten distance), 
   p = 2이면 유클리드 거리(Euclidean distance)이다. 
   
▶ metric : str or callable 
	default는 'minkowski' 방식. 다른 걸로도 설정 가능한데 보통 p로 조절하는 듯 하다. 

6번문제

정확도를 비교하는 문제였는데 accuracy_score 를 구하는 api 를 주지 않았던걸로 기억한다.
from sklearn.metrics import accuracy_score

이상치를 제거하라는 조건이 있었다. (5번인지 6번인지 헷갈,,)
이상치의 조건은
Median - 2.3*IQR or Median + 2.3*IQR 인 경우
IQR 을 구하는 방식은 pd.quantile로 풀라고 문제에서 주어졌다.

median = df["column"].median()
IQR = df["column"].quantile(q=0.75) - df["column"].quantile(q=0.25)
profile
software developer

0개의 댓글