Py) 실기시험 대비 정리 노트 - 04

Py) 실기시험 대비 정리 노트 - 04

각종 데이터 분석 실기시험 대비에 도움이 되는 파이썬 문법을 모아보았다. 그 네 번째로 머신러닝을 다룬다.

※ 본 내용은 Load 함수 블럭에서 iris.csv 파일을 불러온 후에 진행한다.
iris.csv 다운받기 [클릭]

1
2
3
import pandas as pd
df = pd.read_csv("iris.csv")
df.head(2)

데이터 세트 분할

Pandas 표본 추출

Pandas 데이터프레임의 .sample() 메서드의 인자는 다음과 같다.

- n: 표본 추출할 데이터(row) 개수
- frac: 표본 추출할 데이터(row) 비율
- replace: 복원추출 여부
- weights: 추출 데이터의 가중치(추출 대상 데이터의 row 개수와 여기에 입력되는 가중치 개수가 같아야 한다)
- random_state: 임의 확률과정 고정을 위한 자연수. np.random.seed() 기능과 같다.

1
2
df_sample = df.sample(n = 3, random_state = 123)
df_sample

train_test_split() 함수의 인자는 다음과 같다.

- arrays: 입력 데이터
- test_size: 평가 데이터의 비율 또는 개수(실수, 정수)
- train_size: 학습 데이터의 비율 또는 개수(실수, 정수)
- random_state: 임의 확률과정 고정을 위한 자연수. np.random.seed() 기능과 같다.
- suffle: 분리 전에 임의로 데이터를 섞는 기능
- stratify: 층화 표본 추출을 위한 인자

1
2
3
4
5
6
7
from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, train_size = 10)
len(df_train)
## 10

len(df_test)
## 140
1
2
3
4
5
6
df_train, df_test = train_test_split(df, train_size = 0.7)
len(df_train)
## 105

len(df_test)
## 45

모델 성능 평가

수치형 종속변수

수치형 종속변수인 경우 오차 평가를 위해 다음의 객체를 준비한다.

1
2
3
4
5
from sklearn.metrics import mean_absolute_error # MAE
from sklearn.metrics import mean_squared_error # MSE

ser_true_value = pd.Series([1, 2, 3, 4, 5, 6, 7, 8])
ser_pred_value = pd.Series([2, 1, 4 ,3, 2, 5, 7, 6])

- MSE: Mean Squared Error
- MAE: Mean Absolute Error
- RMSE: Root Mean Squared Error
- MAPE: Mean Absolute Percentage Error
※ MAPE를 계산하는 mean_absolute_percentage_error() 함수는 scikit-learn 0.24 버전 부터 사용 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
print(mean_squared_error(y_true = ser_true_value,
y_pred = ser_pred_value)) # MSE
## 2.25

print(mean_squared_error(y_true = ser_true_value,
y_pred = ser_pred_value) ** 0.5) # RMSE
## 1.5

print(mean_absolute_error(y_true = ser_true_value,
y_pred = ser_pred_value)) # MAE
## 1.25

# scikit-learn < 0.24
print(abs((ser_true_value - ser_pred_value) / ser_true_value).sum() * 100) # MAPE
## 309.99999999999994

# scikit-learn >= 0.24
print(mean_absolute_percentage_error(y_true = ser_true_value,
y_pred = ser_pred_value)) # MAPE
## 309.99999999999994

범주형 종속변수

범주형 종속변수인 경우 오분류 평가를 위해 다음의 객체를 준비한다.

1
2
3
4
ser_true_class = pd.Series(["A", "A", "A", "A", "B", "B", "B", "B"])
ser_pred_class = pd.Series(["A", "A", "B", "B", "A", "B", "B", "B"])
pd.crosstab(ser_true_class,
ser_pred_class)

오분류 평가를 위한 대표적인 개념은 다음과 같다.
- Accuracy: 정확도
- Precision: 정밀도(참이라고 분류한 것 중에서 실제 참인 것의 비율)
- Recall: 재현율(참인 것 중에서 참이라고 예측한 것의 비율)
- F1-score: 정밀도와 재현율의 조화평균

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score

print(accuracy_score(y_true = ser_true_class,
y_pred = ser_pred_class))
## 0.625

print(precision_score(y_true = ser_true_class,
y_pred = ser_pred_class,
pos_label = "A"))
## 0.6666666666666666

print(recall_score(y_true = ser_true_class,
y_pred = ser_pred_class,
pos_label = "A"))
## 0.5

print(f1_score(y_true = ser_true_class,
y_pred = ser_pred_class,
pos_label = "A"))
## 0.5714285714285715

상기 코드에서 pos_label 의 pos 는 positive이며, 해당 인자에는 분류 정확도를 보고자 하는 목표값을 입력하면 된다.

선형회귀

선형회귀는 statsmodelsols() 함수를 사용한 방법과 sklearnLinearRegression() 함수를 사용한 방법이 있다. statsmodels 는 각종 통계량과 함께 상세한 선형회귀 결과를 확인할 수 있다.

statsmodels

1
2
3
from statsmodels.formula.api import ols
model_1 = ols("SepalLength ~ SepalWidth + PetalLength", data = df).fit()
model_1.summary()

sklearn

sklearn.summary() 메서드가 없고 상세 내역을 arribute를 사용하여 뽑아야 한다.

1
2
3
4
5
6
7
8
from sklearn.linear_model import LinearRegression
model_1 = LinearRegression(fit_intercept = True)
model_1.fit(X = df[["SepalWidth", "PetalLength"]], y = df["SepalLength"])
model_1.coef_
## array([0.59552475, 0.47192004])

model_1.intercept_
## 2.249140160383228

로지스틱회귀

분류 모델을 위해서 다음과 같이 Speciees 변수의 값을 활용하여 is_setosa 변수를 새로 만들어준다.

1
2
df["is_setosa"] = (df["Species"] == "setosa") + 0
df.head(2)

statsmodels

1
2
3
from statsmodels.api import Logit
model_2 = Logit(endog = df["is_setosa"], exog = df.iloc[:, :2]).fit()
model_2.summary()
1
2
3
4
5
6
7
8
9
model_2.params # coefficient
## SepalLength -7.529945
## SepalWidth 13.130734
## dtype: float64

np.exp(model_2.params) # OR, Odds Ratio
## SepalLength 0.000537
## SepalWidth 504202.644901
## dtype: float64

sklearn

1
2
3
4
5
6
7
8
from sklearn.linear_model import LogisticRegression
model_2 = LogisticRegression(solver = "newton-cg").fit(X = df.iloc[:, :2], y = df["is_setosa"])

model_2.coef_
## array([[-3.38829663, 3.16451973]])

np.exp(model_2.coef_) # OR, Odds Ratio
## array([[ 0.03376614, 23.67736985]])

k-means clustering

자격시험에서는 보통 결과를 고정하기 위해서 “random_state” attribute에 값을 할당하니 참고하도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from sklearn.cluster import KMeans
model_3 = KMeans(n_clusters = 3, random_state = 123).fit(X = df.iloc[:, :4])

model_3.cluster_centers_
## array([[5.006 , 3.428 , 1.462 , 0.246 ],
## [6.85 , 3.07368421, 5.74210526, 2.07105263],
## [5.9016129 , 2.7483871 , 4.39354839, 1.43387097]])

model_3.labels_
## array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
## 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
## 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
## 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
## 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1,
## 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1,
## 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2])

군집 성능을 평가하기 위해서 사용하는 Silhouette score는 다음과 같이 산출한다.

1
2
3
from sklearn.metrics import silhouette_score
silhouette_score(X = df_x, labels = model_3.labels_)
## 0.5528190123564102

Hierarchical clustering

1
2
3
4
5
6
7
8
9
10
11
from sklearn.cluster import AgglomerativeClustering
model_4 = AgglomerativeClustering(n_clusters = 3).fit(X = df.iloc[:, :4])

model_4.labels_
## array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
## 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
## 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
## 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
## 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2,
## 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2,
## 2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0], dtype=int64)

k-NN

1
2
3
4
5
6
7
from sklearn.neighbors import KNeighborsClassifier
model_5 = KNeighborsClassifier(n_neighbors = 5).fit(X = df.iloc[:, :4], y = df["Species"])
model_5.predict(df.iloc[:, :4])[:20]
## array(['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
## 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
## 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
## 'setosa', 'setosa'], dtype=object)

Decision Tree

1
2
3
4
5
6
7
8
9
10
11
from sklearn.tree import DecisionTreeClassifier
model_6 = DecisionTreeClassifier().fit(X = df.iloc[:, :4], y = df["Species"])

model_6.feature_importances_
## array([0. , 0.01333333, 0.56405596, 0.42261071])

model_6.predict(X = df.iloc[:, :4])[:20]
## array(['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
## 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
## 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
## 'setosa', 'setosa'], dtype=object)

Naive Bayes

1
2
3
4
5
6
7
8
9
10
11
from sklearn.naive_bayes import GaussianNB
model_7 = GaussianNB().fit(X = df.iloc[:, :4], y = df["Species"])

model_7.classes_
## array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

model_7.predict_proba(df.iloc[:, :4])[:4, ] # 'setosa', 'versicolor', 'virginica'
## array([[1.00000000e+00, 1.35784265e-18, 7.11283512e-26],
## [1.00000000e+00, 1.51480769e-17, 2.34820051e-25],
## [1.00000000e+00, 1.07304179e-18, 2.34026774e-26],
## [1.00000000e+00, 1.46619543e-17, 2.95492722e-25]])

<실기시험 대비 시리즈 - Python>
Python 실기시험 대비 정리 노트 - 00
Python 실기시험 대비 정리 노트 - 01
Python 실기시험 대비 정리 노트 - 02
Python 실기시험 대비 정리 노트 - 03
Python 실기시험 대비 정리 노트 - 04

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×