살콤아내 자기계발/파이썬

파이썬 머신러닝 완벽가이드 3주차 정리 (평가 175pg, Diabetes 실습)

살콤아내 2021. 5. 4. 12:28
728x90
반응형

diabetes.csv
0.02MB
파이썬머신러닝완벽가이드 175pg_duabates 실습.py
0.00MB

 

 

 

Diabetes 파일을 이용해서 다음 실습을 완료하시오

 

STEP1

1. estimator: logisticRegressor

2. test_train_split: 0.2, 156(random state)

3. 정확도, 정밀도, 재현율을 구하시오

 

 

 

diabetes.csv 파일을 import 한다.

y에는 outcome의 결과값이 들어간다.

177pg에는 X, y 데이터를 다른 방법으로 호출했다.

data1=data.iloc[:, :] row, column 데이터가 전부 다 담긴다.

data2=data.iloc[:, :-1] row는 전부 다 선택, column은 가장 마지막에서 한 줄을 제외한다.>>feature데이터

data3=data.iloc[:, -1] row는 전부 다 선택, column은 가장 마지막에 있는 한 줄만 포함한다.>>test데이터

 

 

 

STEP2

4. threshold에 의한 정밀도, 재현율 그래프를 구하시오: precision_recall_curve_plot

5. ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI'] 각 Column에서 0이 차지하는 비율 구하기

6. 각 feature들의 element들 중에서 0의 값을 평균값으로 대체

 

 

내가 작성한 답 (precision_recall_curve_plot 함수가 다음과 같은 에러메시지와 함께 구현되지 않음)

51줄을 지웠지만 그래프는 그려지지 않는다. 선생님이 써주신 다음 코드를 추가해서 다시 그래프를 그려보았다. 

plt.plot(thresholds, precisions[ 0:len(thresholds)])

plt.plot(thresholds, recalls[ 0:len(thresholds)])

 

 

 

선생님의 답 (설명)

threshold, recall, precision 데이터 사이즈가 일정하지 않아서 [0:len(thresholds)] 슬라이싱을 해서 그래프를 그려야 한다.

 

내가 작성한 답 두 번째

선생님의 답 두 번째 


zero_features = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI')

for row in zero features;

     temp=X[X[row]==0][row]

     print ( round ( (temp.shape[0]/X.shape[0]) * 100, 2) )

     X[row] = X[row].replace(0, X[row].mean() )

 

 

빨간부분은 feature의 DataFrame 형태 값이다. X(원본데이터프래임)의 X[row]==0 의 boolean값을 X의 인덱스로 접근함. 예를들어 Glucose가 0의 값을 가진 데이터프래임의 집합일 것이다. 거기에 [row]를 추가하면 그 데이터 프레임의 Glucose Column 한 줄을 말한다. Temp는 Glucose가 0인 데이터의 개수의 shape[0], 즉, 데이터 사이즈를 말한다. X.shape[0]은 전체 데이터의 개수를 말한다. 

 

참고) stratify=y는 y(결정값)라는 변수의 분포로 train_test_split를 해달라는 뜻

 

 

STEP3

7. StandardScaler 클래스로 feature 데이트 세트에 스케일링 적용

8. LogisticRegression 이용 학습 및 예측 (train_test_split에서 parameter 중 stratify=y 설정)

9. thresholds = [0.3, 0.33, 0.36, 0.39, 0.42, 0.45, 0.48, 0.50]

10. 5개의 성능지표가 있는데, 5개 성능지표의 평균이 가장 높은 thresholds값을 구하여라

 

참고) 책에 나온대로 getget_clf_eval(y_test,pred,pred_proba)와 get_eval_by_threshold(y_test, pred_proba[:,1], reshape(-1,1), thresholds) 함수를 사용했는데 000 is not defined 라는 Name Error가 뜬다. 그 이유는 이전 코드에서 함수를 def하지 않았기 때문이다. (책은 이전 코드를 사용한다는 전제로 구성됨)

 

 

pred_proba.reshape(-1, 1)를 하는 이유는 binarizer 클래스를 사용할 때 dimension error가 나온기 때문이다. (binarizer는 2차원 데이터를 사용한다)

 

 

 

 

참고) threshold값이 변화면 정확도, 정밀도, 재현율, F1값은 변하지만 AUC(곡선아래넓이)값은 변하지 않는다.

728x90
반응형