💠 AIchemist 1주차 💠

2023. 9. 25. 19:41개발/💠 Alchemist

 

 

⏰ 진행 타임라인 ⏰

19:00 ~ 19:15       근황 토크 및 과제 확인
19:20 ~ 20:00      강의 세션
20:00 ~ 20:05     쉬는 시간
20:05 ~ 20:25     Q&A
20:25 ~ 21:00      실습 

 

 

1.  개념 정리

https://sosoeunii.tistory.com/91

 

💠 Python 기반 머신러닝 - NumPy, Pandas 💠

🔹 머신러닝의 개념 https://sosoeunii.tistory.com/86 💠 머신러닝 기초 개념 💠 1. 인공지능 vs 머신러닝 vs 딥러닝 1-1. 각각의 상관관계와 정의 인공지능 : 인간의 지적 능력을 컴퓨터를 통해 구현한 기

sosoeunii.tistory.com

https://sosoeunii.tistory.com/92

 

💠 사이킷런 ( scikit-learn )💠

🔹 사이킷런 소개와 특징 사이킷런은 가장 대표적인 파이썬 머신러닝 라이브러리이다 - 파이썬스러운 API 제공 - 다양한 알고리즘, 편리한 프레임워크와 API 제공 - 오랜 기간 다양한 환경에서 사

sosoeunii.tistory.com

 

 

2.  Q&A

1. Ndarray vs DataFrame

    구조적 차이 / 데이터 셀렉션 방법 - [ ] 연산자

2.  DataFrame vs Series

3.  groupby란?

4.  교차 검증이 필요한 이유

5.  머신러닝 프로세스 정리

 

 

3.  실습

 

<붓꽃 품종 예측하기>

 

필요한 모듈 import

from sklearn.datasets import load_iris        # 내장 데이터set
from sklearn.tree import DecisionTreeClassifier      # 트리 기반 ML 알고리즘
from sklearn.model_selection import train_test_split      # 학습/테스트 데이터 분리

 

import pandas as pd

iris = load_iris()     # 붓꽃 데이터set 로딩하기
iris_data = iris.data     # iris.data : Iris 데이터set에서 피처 데이터를 numpy로 가짐
iris_label = iris.target     # iris.target : Iris 데이터set에서 레이블(결정값) 데이터를 numpy로 가짐

print('iris target 값: ', iris_label)
print('iris target 명: ', iris.target_names)

# 붓꽃 데이터set DataFrame 형식으로 변환
iris_df = pd.DataFrame(data = iris_data, columns = iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)

 

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


dt_clf = DecisionTreeClassifier(random_state = 11)	# 결정 트리 객체 생성

dt_clf.fit(X_train, y_train)	# fit()함수 : 학습 데이터로 모델 학습시키기
pred = dt_clf.predict(X_test)	# predict()함수 : 테스트 데이터로 모델 예측

# 평가 - 정확도
from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test, pred)))

 

 

< 타이타닉 생존자 예측 >

 

import 해야 되는 거

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

 

데이터 세팅

titanic_df = pd.read_csv('/Users/jeongsoeun/Downloads/titanic_train.csv')
print('\n ### 학습 데이터 정보 ### \n')
print(titanic_df.info())

 

데이터 전처리 - Null값 처리

titanic_df['Age'].fillna(titanic_df['Age'].mean(), inplace = True)
titanic_df['Cabin'].fillna('N', inplace = True)
titanic_df['Embarked'].fillna('N', inplace = True)
print('데이터 세트 Null 값 개수 ', titanic_df.isnull().sum().sum())

 

Cabin 칼럼 - 가장 앞글자 기준으로 초기화

print(' Sex 값 분포 : \n', titanic_df['Sex'].value_counts())
print('\n Cabin 값 분포 :\n', titanic_df['Cabin'].value_counts())
print('\n Embarked 값 분포 :\n', titanic_df['Embarked'].value_counts()

titanic_df['Cabin'] = titanic_df['Cabin'].str[:1]
print(titanic_df['Cabin'].head(3))

 

성별 기준으로 생존 여부 카운트 -> 시각화

#'Sex', 'Survived' 칼럼 groupby 후 'Sex'를 기준으로 'Survived' 개체 count
titanic_df.groupby(['Sex','Survived'])['Survived'].count()

# 데이터 시각화 - Seaborn 패키지 이용
sns.barplot(x='Sex', y = 'Survived', data = titanic_df)
sns.barplot(x='Pclass', y = 'Survived', hue = 'Sex', data = titanic_df)

# 나이별로 카테고리 구분하는 함수
def get_category(age):
    cat=''
    if age <= -1: cat='Unknown'
    elif age <= 5: cat = 'Baby'
    elif age <= 12: cat = 'Child'
    elif age <= 18: cat = 'Teenager'
    elif age <= 25: cat = 'Student'
    elif age <= 35: cat = 'Young Adult'
    elif age <= 60: cat = 'Adult'
    else: cat = 'Elderly'
    
    return cat

# 막대 그래프의 크기 figure를 더 크게 설정
plt.figure(figsize=(10, 6))

# 카테고리 이름
group_names=['Unknown', 'Baby', 'Child', 'Teenager', 'Student', 'Young Adult', 'Adult', 'Elderly']

# 'Age_cat' 칼럼 초기화 -> lambda식으로( x: 'Age' 칼럼 요소, get_category 함수에 x 대입 )
titanic_df['Age_cat'] = titanic_df['Age'].apply(lambda x : get_category(x))

# 데이터 시각화
sns.barplot(x = 'Age_cat', y = 'Survived', hue = 'Sex', data = titanic_df, order = group_names)

# 'Age_cat' 칼럼 삭제, 원본 삭제
titanic_df.drop('Age_cat', axis = 1, inplace = True)

 

데이터 전처리 - 레이블 인코딩

from sklearn.preprocessing import LabelEncoder

def encode_features(dataDF):
    features = ['Cabin', 'Sex', 'Embarked']
    for feature in features:
    	# LabelEncoder 객체 생성
        le = LabelEncoder()
        
        # features의 요소를 칼럼명으로 갖는 칼럼 -> fit()과 transform() 적용해서 칼럼 초기화
        le = le.fit(dataDF[feature])
        dataDF[feature] = le.transform(dataDF[feature])
    
    return dataDF

titanic_df = encode_features(titanic_df)
titanic_df.head()

 

데이터 전처리 과정 총정리

def fillna(df):
    df['Age'].fillna(df['Age'].mean(), inplace = True)
    df['Cabin'].fillna('N', inplace = True)
    df['Embarked'].fillna('N', inplace = True)
    df['Fare'].fillna('N', inplace = True)
    return df

def drop_features(df):
    df.drop(['PassengerId', 'Name', 'Ticket'], axis = 1, inplace = True)
    return df

def format_features(df):
    df['Cabin'] = df['Cabin'].str[:1]
    features = ['Cabin', 'Sex', 'Embarked']
    for feature in features:
        le = LabelEncoder()
        le = le.fit(df[feature])
        df[feature] = le.transform(df[feature])
    return df

def transform_features(df):
    df = fillna(df)
    df = drop_features(df)
    df = format_features(df)
    return df
    
  
titanic_df = pd.read_csv('/Users/jeongsoeun/Downloads/titanic_train.csv')
y_titanic_df = titanic_df['Survived']
X_titanic_df = titanic_df.drop('Survived', axis = 1)
X_titanic_df = transform_features(X_titanic_df)

 

학습 데이터, 테스트 데이터 분리

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_titanic_df, y_titanic_df, test_size = 0.2, random_state = 11)

 

ML 알고리즘 - 결정 트리, 랜덤 포레스트, 로지스틱 회귀

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

dt_clf = DecisionTreeClassifier(random_state = 11)
rf_clf = RandomForestClassifier(random_state = 11)
lr_clf = LogisticRegression(solver = 'liblinear')

# 결정 트리 - 학습/예측/평가
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)))

# 랜덤 포레스트 - 학습/예측/평가
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)))

# 로지스틱 회귀 - 학습/예측/평가
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)))

 

교차 검증 - KFold

from sklearn.model_selection import KFold

def exec_kfold(clf, folds = 5):
	# 폴드 세트가 5개인 KFold 객체 생성, 폴드 수만큼 예측 결과 저장을 위한 리스트 객체 생성
    kfold = KFold(n_splits = folds)
    scores=[]
    
    ### KFold 교차 검증 수행 ###
    
    # KFold 객체의 split()을 호출하면 폴드 별 학습, 테스트 데이터의 로우 인덱스를 array로 변환
    # (iter_count, (학습 데이터 인덱스, 테스트 데이터 인덱스)) 튜플 형태로 반복문 수행 - enumerate
    for iter_count, (train_index, test_index) in enumerate(kfold.split(X_titanic_df)):
        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개 폴드에서 평균 정확도 계산 - mean() : 평균 계산
    mean_score = np.mean(scores)
    print("평균 정확도: {0:.4f}".format(mean_score))

exec_kfold(dt_clf, folds = 5)

 

교차 검증 - cross_val_score() API 이용

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)))

 

결정트리의 최적 하이퍼 파라미터 찾고 예측 성능 측정 - 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.best_params_)
print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dclf.best_score_))
best_dclf = grid_dclf.best_estimator_

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

 

 


 

히히

 

 

'개발 > 💠 Alchemist' 카테고리의 다른 글

💠 Alchemist 2주차 💠  (0) 2023.10.01
💠 평가 💠  (0) 2023.09.26
💠 사이킷런 ( scikit-learn )💠  (0) 2023.09.19
💠 Python 기반 머신러닝 - NumPy, Pandas 💠  (0) 2023.09.19
💠 AIchemist 1기 모집 & OT 💠  (0) 2023.09.18