데이터 분류_02

ROK·2022년 1월 12일
0

AIFFEL

목록 보기
10/17

앞에서 연습했던 Iris 품종 분류와 같이 데이터 분류에 대해서 계속 공부해보자

데이터 분류_01

scikit-learn의 예제 데이터를 활용한다

손글씨 이미지 분류

첫 번째 연습
손글씨 이미지 0~9까지 열 가지 카테고리로 분류하는 연습

필요한 모듈 import 하기

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.matrics import classification_report

데이터 준비

load_digits 메서드 사용

digits = load_digits()

digits_data = digits.data
digits_label = digits.target
print(digits.target_names)

train, test 데이터 분리

모델 학습용, 테스트용 문제지와 답지를 준비한다.
x_train, x_test, y_train, y_test 생성 방법 참고

x_train, x_test, y_train, y_test = train_test_split(digits_data, digits_label, test_size=0.3, random_state=10

다양한 모델로 학습 및 평가하기

학습 데이터 x_train, y_train을 활용해 분류기 모델 만들기, 어떤 모델이 성능이 가장 좋은지 확인하고 accuracy, Confusion matrics를 통해 평가해보자

  • Decision Tree 사용해 보기
  • Random Forest 사용해 보기
  • SVM 사용해 보기
  • SGD Classifier 사용해 보기
  • Logistic Regression 사용해 보기

Decision Tree

from sklearn.tree import DecisionTreeClassifier

decision_tree = DecisionTreeClassifier(random_state=54)
decision_tree.fit(x_train, y_train)
y_pred = decision_tree.predict(x_test)

print(confusion_matrix(y_test, y_pred))

print(classification_report(y_test, y_pred))
print("accuracy : ",accuracy_score(y_test, y_pred))

Random Forest

from sklearn.ensemble import RandomForestClassifier

random_forest = RandomForestClassifier(random_state=32)
random_forest.fit(x_train, y_train)
y_pred = random_forest.predict(x_test)

print(confusion_matrix(y_test, y_pred))

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

Support Vector Machine

from sklearn import svm
svm_model = svm.SVC()

svm_model.fit(x_train, y_train)
y_pred = svm_model.predict(x_test)

print(confusion_matrix(y_test, y_pred))

print(classification_report(y_test, y_pred))
print("accuracy : ",accuracy_score(y_test, y_pred))

Stochastic Gradient Descent Classifier (SGDClassifier)

from sklearn.linear_model import SGDClassifier
sgd_model = SGDClassifier()

sgd_model.fit(x_train, y_train)
y_pred = sgd_model.predict(x_test)

print(confusion_matrix(y_test, y_pred))

print(classification_report(y_test, y_pred))
print("accuracy : ",accuracy_score(y_test, y_pred))

Logistic Regression

from sklearn.linear_model import LogisticRegression
# logistic_model = LogisticRegression(solver='liblinear')
logistic_model = LogisticRegression(solver='newton-cg')
# logistic_model = LogisticRegression(solver='saga')

logistic_model.fit(x_train, y_train)
y_pred = logistic_model.predict(x_test)

print(confusion_matrix(y_test, y_pred))

print(classification_report(y_test, y_pred))
print("accuracy : ",accuracy_score(y_test, y_pred))

digits 데이터셋의 경우 데이터의 분포가 고르고 오차행렬과 정확도의 차이가 없어 정확도를 사용해도 오류가 없을 것으로 생각돼 정확도를 사용했다.
digits 데이터셋은 SVM 모델이 가장 높은 결과값을 보여 가장 좋은 조합이라고 볼 수 있다.
단, digits의 경우 클래스가 10개 밖에 안되어서 선형분류를 사용해도 괜찮지만 클래스 수가 많아진다면 오히려 효율이 떨어질 것으로 생각된다.

다만, 왜 digits 데이터 셋이 SVM 모델과 가장 높은 결과값을 보이는지, 어떤 특성이 SVM 모델과 적합한지에 대해서 이해하지 못 했다. 이는 추후에 공부해서 다시 정리해야한다.

최종 코드

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score
from sklearn import svm

digits = load_digits() # 데이터 불러오기
digits_data = digits.data # data 지정
digits_label = digits.target # target 지정
print(digits.target_names) # target_names 출력하기

x_train, x_test, y_train, y_test = train_test_split(digits_data, digits_label, test_size=0.3, random_state=10)

svm_model = svm.SVC()

svm_model.fit(x_train, y_train)
y_pred = svm_model.predict(x_test)

print("accuracy : ",accuracy_score(y_test, y_pred))

와인 분류

필요한 모듈 import 하기

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.matrics import classification_report

데이터 준비

load_digits 메서드 사용

digits = load_wine()

wine_data = wine.data
wine_label = wine.target
print(wine.target_names)

train, test 데이터 분리

모델 학습용, 테스트용 문제지와 답지를 준비한다.
x_train, x_test, y_train, y_test 생성 방법 참고

x_train, x_test, y_train, y_test = train_test_split(digits_data, digits_label, test_size=0.3, random_state=10

다양한 모델로 학습 및 평가하기

학습 데이터 x_train, y_train을 활용해 분류기 모델 만들기, 어떤 모델이 성능이 가장 좋은지 확인하고 accuracy, Confusion matrics를 통해 평가해보자

  • Decision Tree 사용해 보기
  • Random Forest 사용해 보기
  • SVM 사용해 보기
  • SGD Classifier 사용해 보기
  • Logistic Regression 사용해 보기

Decision Tree

from sklearn.tree import DecisionTreeClassifier

decision_tree=DecisionTreeClassifier(random_state=100)
decision_tree.fit(x_train, y_train)
y_pred = decision_tree.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

Random Forest

from sklearn.ensemble import RandomForestClassifier

random_forest=RandomForestClassifier(random_state=23)
random_forest.fit(x_train, y_train)
y_pred = random_forest.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

Support Vector Machine

from sklearn import svm

svm_model = svm.SVC()
svm_model.fit(x_train, y_train)
y_pred = svm_model.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

Stochastic Gradient Descent Classifier (SGDClassifier)

from sklearn.linear_model import SGDClassifier
import warnings

warnings.filterwarnings('ignore')

sgd_model = SGDClassifier()
sgd_model.fit(x_train, y_train)
y_pred = sgd_model.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

Logistic Regression

from sklearn.linear_model import LogisticRegression

logistic_model = LogisticRegression(solver='liblinear')
logistic_model.fit(x_train, y_train)
y_pred = logistic_model.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

만약 각 wine 클래스의 가격이 모두 다르다고 가정했을 때, 가격이 낮은 와인을 비싸게 분류하는 것은 큰 문제가 없지만, 가격이 비싼 와인을 싸게 분류하는 것은 문제가 된다. 비싼 것을 참 싼 것을 거짓이라고 한다면, FN이 적어야 하기 때문에 Recall 값이 높은 데이터를 선택했다.
따라서 Random Forest가 Recall 값이 0.99로 가장 높게 나왔기 때문에 Random Forest를 선택했다

wine 데이터의 경우 Random Forest와 Logistic Regression 모델이 1.0의 신뢰도를 보여 처음에는 오버피팅인 줄 알았으나 팀원들과 이야기 해보니 다른 팀원들도 1.0의 값이 나오고,
random_state의 값을 바꿔 여러번 동작해본 결과 1.0, 1.0, 0.98, 0.99와 같이 높은 수치를 보였기 때문에 오버피팅은 아닌 것으로 판단했다

Random Forest는 임의의 feature를 선택할 때 선택하는 갯수는 fearture 개수가 n이라면 n\sqrt{n} 개를 활용해 분류에 사용한다
따라서 feature 데이터가 너무 적어 Random Forest가 높은 수치를 받았을지도 모르겠다.

최종 코드

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.ensemble import RandomForestClassifier

wine = load_wine()
wine_data = wine.data
wine_label = wine.target
print(wine.target_names)

x_train, x_test, y_train, y_test = train_test_split(wine_data, wine_label, test_size=0.3, random_state=55)

random_forest=RandomForestClassifier(random_state=23)
random_forest.fit(x_train, y_train)
y_pred = random_forest.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

유방암 여부 진단

필요한 모듈 import 하기

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.matrics import classification_report

데이터 준비

load_digits 메서드 사용

digits = load_breast_cancer()

breast_cancer_data = breast_cancer.data
breast_cancer_label = breast_cancer.target
print(breast_cancer.target_names)

train, test 데이터 분리

모델 학습용, 테스트용 문제지와 답지를 준비한다.
x_train, x_test, y_train, y_test 생성 방법 참고

x_train, x_test, y_train, y_test = train_test_split(digits_data, digits_label, test_size=0.3, random_state=10

다양한 모델로 학습 및 평가하기

학습 데이터 x_train, y_train을 활용해 분류기 모델 만들기, 어떤 모델이 성능이 가장 좋은지 확인하고 accuracy, Confusion matrics를 통해 평가해보자

  • Decision Tree 사용해 보기
  • Random Forest 사용해 보기
  • SVM 사용해 보기
  • SGD Classifier 사용해 보기
  • Logistic Regression 사용해 보기

Decision Tree

from sklearn.tree import DecisionTreeClassifier

decision_tree=DecisionTreeClassifier(random_state=77)
decision_tree.fit(x_train, y_train)
y_pred = decision_tree.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

Random Forest

from sklearn.ensemble import RandomForestClassifier

random_forest=RandomForestClassifier(random_state=55)
random_forest.fit(x_train, y_train)
y_pred = random_forest.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

Support Vector Machine

from sklearn import svm

svm_model = svm.SVC()
svm_model.fit(x_train, y_train)
y_pred = svm_model.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

Stochastic Gradient Descent Classifier (SGDClassifier)

from sklearn.linear_model import SGDClassifier

sgd_model = SGDClassifier()
sgd_model.fit(x_train, y_train)
y_pred = sgd_model.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

Logistic Regression

from sklearn.linear_model import LogisticRegression

logistic_model = LogisticRegression(solver='liblinear')
logistic_model.fit(x_train, y_train)
y_pred = logistic_model.predict(x_test)

print(classification_report(y_test, y_pred))
print("accuracy : ", accuracy_score(y_test, y_pred))

print(confusion_matrix(y_test, y_pred))

breast_cancer 데이터셋은 악성을 양성으로 잘 못 판단하는 것 보다 양성을 악성으로 판단하는 것이 더 중요하기 때문에 Recall 값이 큰 모델을 선택했다.
breast_cancer 데이터셋의 경우 Random Forest 모델의 Recall 값이 0.96으로 가장 높게 나왔다
앞의 wine 데이터셋과 함께 생각해봤을 경우 target이 적고, feature가 많을 수록 Random Forest와 Logistic Regression이 가장 높은 결과값을 보여주는 것으로 생각된다.

최종 코드

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
from sklearn.ensemble import RandomForestClassifier

breast_cancer = load_breast_cancer()
breast_cancer_data = breast_cancer.data
breast_cancer_label = breast_cancer.target
print(breast_cancer.target_names)

x_train, x_test, y_train, y_test = train_test_split(breast_cancer_data, breast_cancer_label, test_size=0.3, random_state=22)

random_forest=RandomForestClassifier(random_state=55)
random_forest.fit(x_train, y_train)
y_pred = random_forest.predict(x_test)

print(f1_score(y_test, y_pred))
profile
하루에 집중하자

0개의 댓글