목차
classification 분류 모델
분류 모델은 지도방법에 속한다. 아이템들을 서로 다른 카테고리나 클래스로 분류하는 작업이다.
target attribute는 categorical한 variable로 binary하거나 multi한 클래스로 분류할 수 있다.
machine learning에는 다양한 종류의 알고리즘이 있다.
decision trees, Naive Bayes, linear discriminant analysis, k-nearest neighbor, logistic regression, neural networks, support vector machines
1) K-nearest Neighbours(KNN)
K 이웃의 수
nearest neighbors 가까운 이웃이다.
먼저 k 숫자를 선정한다.
(어떻게 k개를 선정할 것인가?
만약 k=1이라면, 신뢰할 수 없는 결과를 얻을 수 있다. nearest neighbor이 노이즈거나 아웃라이어일 수 있기 때문이다. 특정한 값에 대하여 학습을 하고나면 자칫하면 ovefitting을 유발할 수 있다.
만약 k=20이라면, 과도한 일반화가 일어날 수 있다.
k를 선정하는 가장 좋은 방법은, 각각의 k값에 대하여 test set으로 모델을 평가해보는 것이다.
가장 높은 accuracy가 나오는 모델이 좋다고 판단하고, 그 값을 선택하면 된다.)
unknown case와 모든 데이터 셋들과의 거리를 계산한다.
(유클리드 거리)
그 중 unknown data point와 가장 가까운 이웃들을 k개 정한다.
그 이웃들이 가지고 있는 값들과 가장 근사한 값을 response value로 정한다.
#데이터 다운로드 받기
df = pd.read_csv('teleCust1000t.csv')
df.head()
#타겟의 총 개수를 살펴보기
df['custcat'].value_counts()
#시각화하기, bin:막대기수
df.hist(column='income', bins=50)
#칼럼 살펴보기
df.columns
#instance값들만 가져와서 X에 담기
X = df[['region', 'tenure','age', 'marital', 'address', 'income', 'ed', 'employ','retire', 'gender', 'reside']].values #.astype(float)
X[0:5]
#타겟 값들만 가져와서 Y에 담기
y = df['custcat'].values
y[0:5]
#데이터 전처리 preprocessing (normalize data)
X = preprocessing.StandardScaler().fit(X).transform(X.astype(float))
X[0:5]
#모델링
#train/test split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)
print ('Train set:', X_train.shape, y_train.shape)
print ('Test set:', X_test.shape, y_test.shape)
#적합한 모델 선택하기 k-nearest neighbor
from sklearn.neighbors import KNeighborsClassifier
#파라미터 k값 정하기
k=4
neigh = KNeighborsClassifier(n_neighbors=k).fit(X_train, y_train)
neigh
#Predicting 모델예측값 보기
yhat= neigh.predict(X_test)
yhat[0:5]
#모델 평가하기
from sklearn import metrics
print("Train set Accuracy: ", metrics.accuracy_score(y_train, neigh.predict(X_train)))
print("Test set Accuracy: ", metrics.accuracy_score(y_test, yhat))
#k값 수정해보기
k=6
neigh=KNeighborsClassifier(n_neighbors=k).fit(X_train, y_train)
neigh
yhat=neigh.predict(X_test)
yhat[0:5]
print(metrics.accuracy_score(y_train, neigh.predict(X_train)))
print(metrics.accuracy_score(y_test, yhat))
#여러 개의 k값에 따른 평가값 확인하는 코드
Ks = 10
mean_acc = np.zeros((Ks-1))
std_acc = np.zeros((Ks-1))
for n in range(1,Ks):
#Train Model and Predict
neigh = KNeighborsClassifier(n_neighbors = n).fit(X_train,y_train)
yhat=neigh.predict(X_test)
mean_acc[n-1] = metrics.accuracy_score(y_test, yhat)
std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])
print(mean_acc)
print(std_acc)
#k값에 따른 accuracy평가값을 plot으로 그리기
plt.plot(range(1,Ks),mean_acc,'g')
plt.fill_between(range(1,Ks),mean_acc - 1 * std_acc,mean_acc + 1 * std_acc, alpha=0.10)
plt.fill_between(range(1,Ks),mean_acc - 3 * std_acc,mean_acc + 3 * std_acc, alpha=0.10,color="green")
plt.legend(('Accuracy ', '+/- 1xstd','+/- 3xstd'))
plt.ylabel('Accuracy ')
plt.xlabel('Number of Neighbors (K)')
plt.tight_layout()
plt.show()
#최종적인 k 선정하기
print( "The best accuracy was with", mean_acc.max(), "with k=", mean_acc.argmax()+1)
2) 분류모델의 평가방법 evaluation metrics
- Jaccard index
y: 실제값
y_hat: 모델 예측값
0<= Jaccard index <= 1(높을 수록 높은 accuracy)
- F1-score
confusion metrics를 살펴보자
Precision(정밀도)= TP/(TP+FP)
Recall(재현율, 민감도, TPR)= TP/(TP+FN)
0<=F1<=1(높을 수록 높은 accuracy)
-Log loss
0<=Log loss<=1(낮을 수록 높은 accuracy)
'머신러닝 > machine learning' 카테고리의 다른 글
classification, SVM, support vector machine, kerneling (0) | 2023.05.18 |
---|---|
logistic regression, sigmoid, logistic regression vs linear regression, C, optimizer, softmax (0) | 2023.05.18 |
classification, regression tree (0) | 2023.05.18 |
classification, decision tree, entropy, 지니계수, information gain (0) | 2023.05.17 |
simple linear regression, multiple linear regression (0) | 2023.05.16 |