hdonghun / Python_analysis-visualization

practice Kaggle study Myself
1 stars 0 forks source link

Machine learning _ 머신러닝 공부 #14

Open hdonghun opened 2 years ago

hdonghun commented 2 years ago
  1. 처음 시작

사이킷런 불러오기 : import sklearn 데이터 불러오기 : from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split import pandas as pd 붓꽃 데이터 세트를 로딩합니다. iris = load_iris()

data와 target값을 iris_data, iris_target변수에 넣어주기 : iris_data = iris.data , iris_label = iris.target

label 변수값에 target값을 넣어주어 데이터 프레임을 만들 떄 이용하기, 새로운 컬럼인 label : iris_df['label'] = iris.target

데이터 프레임으로 만들어주기 : iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)

학습/테스트 데이터 셋 분리 – train_test_split() : X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, test_size=0.2, random_state=11)

DecisionTreeClassifier 객체 생성해주기 : dt_clf = DecisionTreeClassifier(random_state=11)

학습 수행 : dt_clf.fit(X_train, y_train)

테스트 데이터 세트로 예측 수행 : pred = dt_clf.predict(X_test)

예측 정확도 평가 하기 : from sklearn.metrics import accuracy_score

print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))

  1. 여러가지 방법들 K 폴드 Stratified K 폴드 cross_val_score( ) GridSearchCV

  2. encoding 과 one-Hot encoding 객체를 컴퓨터 값인 0,1로 만들어 줄때 사용!

  3. 피처 스케일링과 정규화 StandardScaler MinMaxScaler

hdonghun commented 2 years ago

원본 DataFrame은 유지하고 드롭된 DataFrame을 새롭게 객체 변수로 받고 싶다면 inplace = False로 설정(디폴트 값이 False임).

titanic_df = titanic_df.drop('Age_0', axis=1, inplace=False)

DataFrame 및 Series에 reset_index() 메서드를 수행하면 새롭게 인덱스를 연속 숫자 형으로 할당하며 기존 인덱스는 'index'라는 새로운 컬럼 명으로 추가합니다.

hdonghun commented 2 years ago

loc[] : 명칭 기반 인덱싱 iloc[] : 위치 기반 인덱싱 불린 인덱싱(Boolean indexing) : 위치기반, 명칭기반 인덱싱 모두 사용할 필요없이 조건식을 []안에 기입하여 간편하게 필터링을 수행. ex) titanic_boolean = titanic_df[titanic_df['Age'] > 60] titanic_boolean ex) titanic_df[titanic_df['Age']>60][['Name','Age']].head(3)

hdonghun commented 2 years ago

encoding 하는 법 예시 : from sklearn import preprocessing

def encode_features(dataDF): features = ['Cabin', 'Sex', 'Embarked'] for feature in features: le = preprocessing.LabelEncoder() le = le.fit(dataDF[feature]) dataDF[feature] = le.transform(dataDF[feature])

return dataDF

titanic_df = encode_features(titanic_df) titanic_df.head()

hdonghun commented 2 years ago

예시 :

from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score

결정트리, Random Forest, 로지스틱 회귀를 위한 사이킷런 Classifier 클래스 생성

dt_clf = DecisionTreeClassifier(random_state=11) rf_clf = RandomForestClassifier(random_state=11) lr_clf = LogisticRegression()

DecisionTreeClassifier 학습/예측/평가

dt_clf.fit(X_train , y_train) dt_pred = dt_clf.predict(X_test) print('DecisionTreeClassifier 정확도: {0:.4f}'.format(accuracy_score(y_test, dt_pred)))

RandomForestClassifier 학습/예측/평가

rf_clf.fit(X_train , y_train) rf_pred = rf_clf.predict(X_test) print('RandomForestClassifier 정확도:{0:.4f}'.format(accuracy_score(y_test, rf_pred)))

LogisticRegression 학습/예측/평가

lr_clf.fit(X_train , y_train) lr_pred = lr_clf.predict(X_test) print('LogisticRegression 정확도: {0:.4f}'.format(accuracy_score(y_test, lr_pred)))


DecisionTreeClassifier 정확도: 0.7877 RandomForestClassifier 정확도:0.8547 LogisticRegression 정확도: 0.8492

hdonghun commented 2 years ago

K 폴드

from sklearn.model_selection import KFold

def exec_kfold(clf, folds=5):

폴드 세트를 5개인 KFold객체를 생성, 폴드 수만큼 예측결과 저장을 위한 리스트 객체 생성.

kfold = KFold(n_splits=folds)
scores = []

# KFold 교차 검증 수행. 
for iter_count , (train_index, test_index) in enumerate(kfold.split(X_titanic_df)):
    # X_titanic_df 데이터에서 교차 검증별로 학습과 검증 데이터를 가리키는 index 생성
    X_train, X_test = X_titanic_df.values[train_index], X_titanic_df.values[test_index]
    y_train, y_test = y_titanic_df.values[train_index], y_titanic_df.values[test_index]

    # Classifier 학습, 예측, 정확도 계산 
    clf.fit(X_train, y_train) 
    predictions = clf.predict(X_test)
    accuracy = accuracy_score(y_test, predictions)
    scores.append(accuracy)
    print("교차 검증 {0} 정확도: {1:.4f}".format(iter_count, accuracy))     

# 5개 fold에서의 평균 정확도 계산. 
mean_score = np.mean(scores)
print("평균 정확도: {0:.4f}".format(mean_score)) 

exec_kfold 호출

exec_kfold(dt_clf , folds=5)

교차 검증 0 정확도: 0.7542 교차 검증 1 정확도: 0.7809 교차 검증 2 정확도: 0.7865 교차 검증 3 정확도: 0.7697 교차 검증 4 정확도: 0.8202 평균 정확도: 0.7823

hdonghun commented 2 years ago

cross_val_score

from sklearn.model_selection import cross_val_score

scores = cross_val_score(dt_clf, X_titanic_df , y_titanic_df , cv=5) for iter_count,accuracy in enumerate(scores): print("교차 검증 {0} 정확도: {1:.4f}".format(iter_count, accuracy))

print("평균 정확도: {0:.4f}".format(np.mean(scores)))

교차 검증 0 정확도: 0.7430 교차 검증 1 정확도: 0.7753 교차 검증 2 정확도: 0.7921 교차 검증 3 정확도: 0.7865 교차 검증 4 정확도: 0.8427 평균 정확도: 0.7879

hdonghun commented 2 years ago

GridSearchCV

from sklearn.model_selection import GridSearchCV

parameters = {'max_depth':[2,3,5,10], 'min_samples_split':[2,3,5], 'min_samples_leaf':[1,5,8]}

grid_dclf = GridSearchCV(dt_clf , param_grid=parameters , scoring='accuracy' , cv=5) grid_dclf.fit(X_train , y_train)

print('GridSearchCV 최적 하이퍼 파라미터 :',grid_dclf.bestparams) print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dclf.bestscore)) best_dclf = grid_dclf.bestestimator

GridSearchCV의 최적 하이퍼 파라미터로 학습된 Estimator로 예측 및 평가 수행.

dpredictions = best_dclf.predict(X_test) accuracy = accuracy_score(y_test , dpredictions) print('테스트 세트에서의 DecisionTreeClassifier 정확도 : {0:.4f}'.format(accuracy))


GridSearchCV 최적 하이퍼 파라미터 : {'max_depth': 3, 'min_samples_leaf': 5, 'min_samples_split': 2} GridSearchCV 최고 정확도: 0.7992 테스트 세트에서의 DecisionTreeClassifier 정확도 : 0.8715