행 모두 보기:
pd.set_option('display.max_rows', None)
열(컬럼) 모두 보기:
pd.set_option('display.max_columns', None)
.__all__ / dir / help:
import sklearn
print(sklearn.__all__)
import sklearn
from sklearn import preprocessing
print(dir(preprocessing)
from sklearn.preprocessing import LabelEncoding
print(help(LabelEncoding)
결측
결측치가 너무 많으면 그냥 제거나 0으로 하고,
데이터의 10% 정도면 수치형은 중앙값, 범주형은 최빈값으로 대체
or 결측치가 적으면 제거, 많으면 평균채우기
하이퍼파라미터 튜닝
# 디폴트값
. n_estimators 100
. min_sample_leaf 1 작으면 과적합 위험
. min_sample_split 2 작으면 과적합 위험
# max_depth 너무 크면 과적합 위험)
=> train / validation set을 나눈 후
n_estimators와 max_depth만 조정해 가면서(나머지는 그냥 디폴트로 사용) 과적합 피라기
하이퍼 파라미터 튜닝 시 이런식으로 조절
n_estimators=100
max_depth=3,5,7,9,10...
min_samples_leaf=1,2,3,4,5
rf_hp = {
'max_depth' : [6, 8, 12],
'min_samples_leaf' : [6, 8, 12],
'min_samples_split' : [6, 8, 10]
}
정확도 확인
model = RandomForestClassifier(n_estimators=10)
훈련 세트 정확도 : model.score(X_train, y_train)
테스트 세트 정확도 : model.score(X_test, y_test)
sklearn.metric에서 문제에서 제시하는 평가방식을 import 해서 사용
평가방식의 y_test, predict형식에 대해서는 일부 차이가 있을 수 있음
지표마다 help함수를 이용해서 parameter의 형식을 확인하고 코딩해야함
주로 쓰는 평가방식
- accuracy_score(정확도)
- f1_score (f1,score)
- mean_absolute_error (mae)
- mean_squared_error (mse)
from sklearn.metrics import roc_auc_score
# help(roc_auc_score)
roc_auc_score(y_test, predict_proba_value[:,1])
예측
특정 클래스로 분류될 "확률" 예측할 때 사용
a클래스(첫번째)로 분류될 확률을 구하라 하면
y = model.predict_proba(x_test)
print(y[:, 0]) -> 첫번째 클래스로 분류될 확률
predict() 메소드는 범주를 예측하여 반환하고,
predict_praba() 메소드는 확률(probability)을 반환
제 1유형
【제출 형식】
㉠ 정수(integer)로 입력
(단, 소수점을 포함한 경우 소수점 첫째 자리에서 반올림하여 계산)
㉡ 정수 답안만 입력
import pandas as pd
df = pd.read_csv("data/mtcars.csv")
pd.set_option('display.max_columns', None)
# print(df.head())
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
df[['qsec']] = mm.fit_transform(df[['qsec']])
print(len(df[df['qsec'] > 0.5]))
제 2유형
제공된 데이터는 백화점 고객이 1년간 상품을 구매한 속성 데이터이다. 제공된 학습용 데이터(data/customer_train.csv)를 이용하여 백화점 구매 고객의 성별을 예측하는 모델을 개발하고, 개발한 모델에 기반하여 평가용 데이터(data/customer_test.csv)에 적용하여 얻은 성별 예측 결과를 아래 【제출 형식】에 따라 CSV 파일로 생성하여 제출하시오.
* 예측 결과는 ROC-AUC 평가지표에 따라 평가함
* 성능이 우수한 예측 모델을 구축하기 위해서는 데이터 정제, Feature Engineering, 하이퍼 파라미터(hyper parameter) 최적화, 모델 비교 등이 필요할 수 있음. 다만, 과적합에 유의하여야 함.
【제출 형식】
㉠ CSV 파일명 : result.csv (파일명에 디렉토리·폴더 지정불가)
㉡ 예측 성별 칼럼명 : pred
㉢ 제출 칼럼 개수 : pred 칼럼 1개
결측치가 너무 많으면 그냥 제거하고, 데이터의 10% 정도면 수치형은 중앙값, 범주형은 최빈값으로 대체
결측치가 적으면 제거, 많으면 평균채우기
import pandas as pd
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")
# 모든 컬럼 보기
pd.set_option('display.max_columns', None)
# 결측치 확인
# print(train.info())
# print(test.info())
# 결측치 대체
train['환불금액'] = train['환불금액'].fillna(0)
test['환불금액'] = test['환불금액'].fillna(0)
# 데이터 범주형 있는지 확인
# print(train.head())
# print(test.head())
# # 라벨 인코딩(범주형)
from sklearn.preprocessing import LabelEncoder
lb = LabelEncoder()
train['주구매상품'] = lb.fit_transform(train['주구매상품'])
test['주구매상품'] = lb.transform(test['주구매상품'])
train['주구매지점'] = lb.fit_transform(train['주구매지점'])
test['주구매지점'] = lb.transform(test['주구매지점'])
# print(train)
# print(test)
X_train = train.iloc[:, 1:10]
y_train = train.iloc[:, -1]
X_test = test.iloc[:, 1:]
# print(X_train)
# print(y_train)
# print(X_test)
# RF 모델링
from sklearn.ensemble import RandomForestClassifier
# help(RandomForestClassifier)
rf = RandomForestClassifier(n_estimators = 100, max_depth = 3, min_samples_leaf = 6, min_samples_split = 6)
rf.fit(X_train, y_train)
pred = rf.predict(X_test)
# print(pred)
# 파일 저장 및 결과 확인
result = pd.DataFrame({'pred': pred})
result.to_csv('result.csv', index=False)
print(pd.read_csv('result.csv'))
※predict proba
predict_prob_array = lr_clf.predict_proba(X_test)
predict_positive_prob = predict_prob_array[:, 1]
roc_auc_score() 할 때는 preds= lr_clf.predict_proba(X_test) 한 뒤 roc_auc_score( y_target, preds[:, 1])
과 같이 한것 같고, 이번에 preds= lr_clf.predict_proba(X_test)[:, 1] 후 roc_auc_score(y_target, preds) 한 것 같습니다.
둘 다 동일한 인자값을 roc_auc_score()에 입력한 것입니다.
# 점수 확인 및 파라미터 튜닝
print("훈련세트 점수:", rf.score(X_train, y_train))
print("테스트세트 점수:", rf.score(X_test, pred))
### sklearn 기본 데이터인 iris 데이터 활용
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
iris_data = load_iris()
dt_clf = DecisionTreeClassifier(random_state=42)
data = iris_data.data
## X label = iris_data.target
## y
### 성능지표는 정확도(accuracy), 교차 검증 세트 3개
scores = cross_val_score(dt_clf, data, label, scoring='accuracy', cv=3)
print('교차 검증별 정확도 : ', np.round(scores, 4))
print('교차 검증 평균 :', np.round(np.mean(scores),4))
제 2유형 2
### 분류 모델 ###
# 결측치 대체
train['환불금액'] = train['환불금액'].fillna(test['환불금액'].mode()[0])
test['환불금액'] = test['환불금액'].fillna(test['환불금액'].mode()[0])
# 라벨인코딩
# 주구매상품, 주구매지점
from sklearn.preprocessing import LabelEncoder
lb = LabelEncoder()
train['주구매상품'] = lb.fit_transform(train['주구매상품'])
train['주구매지점'] = lb.fit_transform(train['주구매지점'])
test['주구매상품'] = lb.fit_transform(test['주구매상품'])
test['주구매지점'] = lb.fit_transform(test['주구매지점'])
# print(train.info())
# print(test.info())
# print(train.head())
# 데이터 분할
from sklearn.model_selection import train_test_split
X = train.drop(columns = ['성별', '회원ID'])
y = train['성별']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 40)
# 모델링
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators = 150, max_depth = 20, min_samples_leaf = 9, min_samples_split =12)
rf.fit(X_train, y_train)
pred1 = rf.predict(X_test) # pred1 : X_test에 대한 예측값
# 성능평가
from sklearn.metrics import roc_auc_score, accuracy_score
roc = roc_auc_score(y_test, pred1)
acc = accuracy_score(y_test, pred1)
print("roc:", roc)
print("acc:", acc)
# 테스트 데이터 예측
test_X = test.drop(columns = ['회원ID'])
pred = rf.predict(test_X)
print("score:", rf.score(X_train, y_train))
# 결과 데이터 제출 및 확인
result = pd.DataFrame({'pred': pred})
result.to_csv("result.csv", index=False)
print(pd.read_csv("result.csv"))
### 회귀 모델 ###
전체 데이터 목록 4009행 중 3800행을 학습용 데이터로 사용하고, 나머지를 테스트 데이터로 사용
목표 변수(price)를 예측하고, 예측결과를 제출
평가지표는 RMSE
=> MAE, MSE, RMSE, MAPE: 낮을수록 좋음
=> MPE: -음수= 과대적합, +양수=과대적합
=> R2-score: 1에 가까울 수록 좋음
회귀: MAE, MSE, RMSE, MAPE, RMSLE, R2_score
분류: Accuracy, Precision, Recall, F1-score, Fall-out
제 3유형
【제출 형식】
㉠ 소수 넷째 자리에서 반올림하여 소수 셋째 자리까지만 계산
코드 답
① Gender와 Survived 변수 간의 독립성 검정을 실시하였을 때, 카이제곱 통계량은? (반올림하여 소수 셋째 자리까지 계산)
# 1. 독립성 검정 : chi2_contingency
from scipy.stats import chi2_contingency
df1 = pd.crosstab(df['Gender'], df['Survived'])
chi2, p, dof, expected = chi2_contingency(df1) # 귀무가설 기각
print(round(chi2, 3))
답: 260.717
- 범주형: pd.crosstab / 수치형 np.array
- chi2: 카이검정, p_val: 신뢰도, dof: 자유도, ex: 기대치
② Gender, SibSp, Parch, Fare를 독립변수로 사용하여 로지스틱 회귀모형을 실시하였을 때, Parch 변수의 계수값은? (반올림하여 소수 셋째 자리까지 계산)
# 2. 로지스틱 회귀모형 : statsmodels.formula.api import logit
from statsmodels.formula.api import logit
formula = 'Survived ~ Gender + SibSp + Parch + Fare'
model = logit(formula, data=df).fit()
print(round(model.params['Parch'], 3))
# model.params 대신 model.summary()로 확인해도 답 나옴
답: -0.201
# 로지스틱 회귀분석 결과 확인
- logit('종속변수명 ~ 독립변수명1 + 독립변수명2 + 독립변수명3', data = 데이터프레임).fit().summary()
- coef는 각독립변수의 오즈비에 log(상용로그가 아닌 e에 대한 로그)를 씌운값(log(오즈비))
오즈비를 보면 해당 독립변수가 종속변수에 미치는 영향을 확인 할 수 있음
# logit 함수의 계수들을 하나의 array로 확인하는 코드
- logit('종속변수명 ~ 독립변수명1 + 독립변수명2 + 독립변수명3', data = 데이터프레임).fit().params
-위 결과에 np.exp()처리를 해주면 각각의 회귀계수들을 밑이 자연상수 e인 지수함수로 변환
③ 위 ②번 문제에서 추정된 로지스틱 회귀모형에서 SibSp 변수가 한 단위 증가할 때 생존할 오즈비(Odds ratio) 값은? (반올림하여 소수 셋째 자리까지 계산)
# 3. SibSp 변수가 한 단위 증가할 때 생존할 오즈비 : np.exp
result = np.exp(model.params)
print(round(result['SibSp'], 3))
답: 0.702
- 전체 코드 -
import pandas as pd
df = pd.read_csv("data/Titanic.csv")
#print(df.info())
#print(df.head())
#1번 문제
from scipy.stats import chi2_contingency
table = pd.crosstab(df.Gender, df.Survived)
chi2, p_val, dof, exp = chi2_contingency(table)
#print(round(chi2,3)) #260.717
#print(p_val) #귀무 가설 기각
#2번 문제
from statsmodels.formula.api import logit
result1 = logit('Survived ~ Gender+SibSp+Parch+Fare', data=df).fit().summary()
#print(result1) #-0.201
#3번 문제
import numpy as np
result2=logit('Survived ~ Gender+SibSp+Parch+Fare', data=df).fit().params
print(result2)
print(np.exp(result2)) #0.702
### 검정 통계량 ###
고혈압 데이터
Ud = 치료 후 혈압 - 치료전 혈압
1) 표본 평균 구하기(소수 둘째자리까지)
df['diff'] = df['bp_after'] - df ['bf_before']
d_mean = round(df['diff']), 2)
from scipy import stats
result = stats.ttest_rel(a['bp_after'], a['bp_before'], alternative='less')
# 앞의 데이터를 기준으로 낮으면 대립가설일 경우 less
# 검정 통계량
result.statistic
# p-val
result.pvalue
-검정통계량-
from scipy import stats
변경 후: stats.ttest_rel(a['bp_after'], a['bp_before'], alternative='less') 결과: Ttest_relResult(statistic=-3.3371870510833657, pvalue=0.0005648957322420411)
### 다중 선형 회귀 ###
import numpy as np
import pandas as pd
import statsmodels.api as sm
# 다중 선형 회귀 모델 재생성
# 독립 변수 생성
X = fish_data_adj[['Length', 'Width', 'Thickness', 'Fin_Length']]
# 종속 변수 생성
y = fish_data_adj['weight']
# 상수항 추가
X = sm.add_constant(X)
# 회귀 모델 생성
model= sm.OLS(y, X).fit()
# 회귀모델 요약 결과 출력
summary = model.summary()
# 분석 결과
const: 절편, coef : 계수, P>|t|: p_val 신뢰도, R-squared: 0<x<1에 있어야 함, Prov: F통계량의 p_val->모델이 통계적으로 잘설명하고 있다
'개발 공부 > 빅데이터분석기사' 카테고리의 다른 글
[빅데이터 분석 기사] tip, 제 1유형, 제 2유형, 제 3유형 통합 요약 (0) | 2024.06.22 |
---|---|
빅데이터분석기사 실기 시험환경 체험하기-작업형 3유형 (0) | 2023.12.01 |
빅데이터 분석기사 실기 Tip (0) | 2023.12.01 |
빅데이터분석기사 실기 시험환경 체험하기-작업형 2유형 (0) | 2023.12.01 |
빅데이터분석기사 실기 시험환경 체험하기 - 작업형 1유형 (0) | 2023.11.30 |