sklearn 학습 (1) 데이터 세트

14303 단어
오늘 한 마디 를 보 았 다.
당신 이 세월 을 남 겨 줄 수 있 는 것 은 세월 이 당신 에 게 남 겨 줄 수 있 는 것 은 더 좋 은 자신 을 제외 하고 다른 것 이 없습니다.
이보다 더 자신 이 공부 하도록 격려 할 수 있 는 것 이 무엇 입 니까?
windows 에 sklearn 을 설치 하고 winpython 을 직접 다운로드 하여 설치 하면 됩 니 다.스스로 32 비트 나 64 비트 를 선택 하 세 요.http://sourceforge.net/projects/winpython/
뒤의 본문 은 모두 sklearn 을 sk 라 고 약칭 한다.sk 는 이미 데이터 세트 를 가지 고 왔 습 니 다. 먼저 iris 와 digits 를 보 세 요.
from sklearn import datasets
iris = datasets.load_iris()
digits = datasets.load_digits()

아이 리 스 는 중국어 로 아이 리 스 식물 을 말 하 는데 여기 꽃받침 과 꽃잎 의 길이 가 모두 4 개의 속성 을 저장 하고 아이 리 스 식물 은 세 가지 로 나 뉜 다.이에 비해 iris 에는 두 개의 속성 iris. data, iris. target 이 있 습 니 다. data 에는 하나의 행렬 이 있 습 니 다. 각 열 은 꽃받침 이나 꽃잎 의 길 이 를 대표 합 니 다. 모두 4 열 입 니 다. 각 열 은 측정 되 는 아이 리 스 식물 을 대표 하고 모두 150 개의 기록 을 채 취 했 습 니 다. 그래서 이 행렬 의 모양 iris. data. shape 를 보고 돌아 갑 니 다.
(150, 4)
target 은 하나의 배열 로 data 에 있 는 모든 기록 이 어떤 아이 리 스 식물 에 속 하 는 지 저장 하기 때문에 배열 의 길 이 는 150 이 고 배열 요소 의 값 은 모두 3 가지 아이 리 스 식물 이 있 기 때문에 서로 다른 값 은 3 개 에 불과 하 다.
digits 는 디지털 인식 데 이 터 를 저장 하고 1797 개의 기록 을 포함 하 며 각 기록 은 8 줄 8 열의 행렬 로 각 디지털 그림 의 픽 셀 정 보 를 저장 합 니 다. digits. image. shape 는 되 돌아 갑 니 다.
(1797, 8, 8)
sk 의 입력 데 이 터 는 (n_samples, n_features) 모양 이 어야 하기 때문에 digits. image 에 번 호 를 매 겨 8 * 8 의 행렬 을 64 개의 요 소 를 포함 하 는 벡터 로 바 꿔 야 합 니 다. 구체 적 인 방법:
import pylab as pl
data = digits.images.reshape((digits.images.shape[0], -1))

data. shape 복귀
(1797, 64)
이상 은 가장 자주 사용 하 는 두 개의 데이터 세트 입 니 다.
sk 에 있 는 모든 분류 기 나 집합 도 구 는 Estimator 대상 입 니 다. 초기 매개 변수 설정:
estimator = Estimator(param1=1, param2=2) estimator.param1

훈련 데 이 터 를 받 을 때 2 개의 배열 을 받 습 니 다:
estimator.fit(data)

훈련 구조의 매개 변수:
estimator.estimated_param_ 

sk 는 Twenty Newsgroups 라 는 텍스트 분류 데이터 세트 도 있 습 니 다. 가 져 오 는 방법:
from sklearn.datasets import fetch_20newsgroups

categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']

twenty_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)

twenty_train.target_names

len(twenty_train.data)

len(twenty_train.filenames)

이 데이터 에는 모두 2257 개의 기록 이 있 고 모든 기록 은 하나의 문서 이다.이 문서 들 을 분류 하려 면 미리 처리 해 야 합 니 다. 두 가지 방법 이 있 습 니 다.
  • 단어 마다 나타 난 횟수 를 통계 한다
  • tf - idf 로 단어의 주파 수 를 통계 합 니 다. tf 는 한 문서 에서 모든 단어 가 나타 나 는 횟수 를 문서 의 단어 총수 로 나 누고 idf 는 전체 문서 수 를 이 단 어 를 포함 하 는 문서 수 로 나 누 어 대 수 를 찾 습 니 다.tf * idf 는 여기 서 사용 하 는 값 입 니 다. 값 이 클 수록 단어 가 중요 하거나 관련 이 있 음 을 나타 냅 니 다.

  • 완전한 텍스트 분류의 예 Out[xx] :
    from sklearn.feature_extraction.text import CountVectorizer
    
    count_vect = CountVectorizer()
    
    X_train_counts = count_vect.fit_transform(twenty_train.data)
    
    X_train_counts.shape
    Out[28]: (2257, 35788)
    
    count_vect.vocabulary_.get(u'algorithm')
    Out[29]: 4690
    
    from sklearn.feature_extraction.text import TfidfTransformer
    
    tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
    
    X_train_tf = tf_transformer.transform(X_train_counts)
    
    X_train_tf.shape
    Out[33]: (2257, 35788)
    
    tfidf_transformer = TfidfTransformer()
    
    X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
    
    X_train_tfidf.shape
    Out[36]: (2257, 35788)
    
    from sklearn.naive_bayes import MultinomialNB
    
    clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)
    
    docs_new = ['God is love', 'OpenGL on the GPU is fast']
    
    X_new_counts = count_vect.transform(docs_new)
    
    X_new_tfidf = tfidf_transformer.transform(X_new_counts)
    
    predicted = clf.predict(X_new_tfidf)
    
    for doc, category in zip(docs_new, predicted):
        print('%r => %s' % (doc, twenty_train.target_names[category]))
    
    'God is love' => soc.religion.christian
    'OpenGL on the GPU is fast' => comp.graphics
    

    위의 예:
  • 단어 마다 나 오 는 횟수 를 먼저 계산 했다
  • 그리고 tf - idf 값
  • 을 계산 했다.
  • 그리고 모형 을 가지 고 훈련
  • 마지막 으로 두 개의 새로운 문서 의 유형 을 예측 했다
  • 보아하니 예측 결 과 는 기본적으로 믿 을 만하 다."Liux 에서 텍스트 를 처리 할 때 파 이 프 를 자주 사용 합 니 다." 여기 도 파이프 로 앞의 몇 단 계 를 연결 할 수 있 습 니 다.
    from sklearn.pipeline import Pipeline
    
    text_clf = Pipeline([('vect', CountVectorizer()),
    ...                      ('tfidf', TfidfTransformer()),
    ...                      ('clf', MultinomialNB()),
    ... ])
    
    text_clf = text_clf.fit(twenty_train.data, twenty_train.target)
    
    import numpy as np
    
    twenty_test = fetch_20newsgroups(subset='test',
    ...     categories=categories, shuffle=True, random_state=42)
    
    docs_test = twenty_test.data
    
    predicted = text_clf.predict(docs_test)
    
    np.mean(predicted == twenty_test.target)
    Out[51]: 0.83488681757656458
    
    from sklearn.linear_model import SGDClassifier
    
    text_clf = Pipeline([('vect', CountVectorizer()),
    ...                      ('tfidf', TfidfTransformer()),
    ...                      ('clf', SGDClassifier(loss='hinge', penalty='l2',
    ...                                            alpha=1e-3, n_iter=5)),
    ... ])
    
    _ = text_clf.fit(twenty_train.data, twenty_train.target)
    
    predicted = text_clf.predict(docs_test)
    
    np.mean(predicted == twenty_test.target)
    Out[56]: 0.9127829560585885
    
    from sklearn import metrics
    
    print(metrics.classification_report(twenty_test.target, predicted,
    ...     target_names=twenty_test.target_names))
                            precision    recall  f1-score   support
    
               alt.atheism       0.94      0.82      0.87       319
             comp.graphics       0.88      0.98      0.92       389
                   sci.med       0.95      0.89      0.92       396
    soc.religion.christian       0.90      0.95      0.92       398
    
               avg / total       0.92      0.91      0.91      1502
    
    
    metrics.confusion_matrix(twenty_test.target, predicted)
    Out[59]: 
    array([[261,  10,  12,  36],
           [  5, 380,   2,   2],
           [  7,  32, 353,   4],
           [  6,  11,   4, 377]])
    
    from sklearn.grid_search import GridSearchCV
    
    parameters = {'vect__ngram_range': [(1, 1), (1, 2)],
    ...               'tfidf__use_idf': (True, False),
    ...               'clf__alpha': (1e-2, 1e-3),
    ... }
    
    gs_clf = GridSearchCV(text_clf, parameters, n_jobs=-1)
    
    gs_clf = gs_clf.fit(twenty_train.data[:400], twenty_train.target[:400])
    
    twenty_train.target_names[gs_clf.predict(['God is love'])]
    Out[64]: 'soc.religion.christian'
    
    best_parameters, score, _ = max(gs_clf.grid_scores_, key=lambda x: x[1])
    
    for param_name in sorted(parameters.keys()):
    ...     print("%s: %r" % (param_name, best_parameters[param_name]))
    ...
    clf__alpha: 0.001
    tfidf__use_idf: True
    vect__ngram_range: (1, 1)
    
    score
    Out[67]: 0.90249999999999997
    

    위의 코드
  • 먼저 pipeline 으로 3 개의 프로 세 서 를 연결 하여 하나의 명령 으로 해결
  • MultinomialNB 분류 기로 훈련 을 마치 고 오 차 를 계산 했다
  • SVM 으로 한 번 더 훈련 하여 오 차 를 계산 하여 앞의 효과 보다 좋다
  • 분류 결과 보고서 인쇄
  • 계산 confusionmatrix (혼동 매트릭스, 관측 상태 전이 확률 매트릭스)
  • GridSearchCV 로 최 적 화 된 매개 변 수 를 검색 합 니 다
  • 점수 표시
  • 기본적으로 sk 로 모델 훈련 과 예측 을 하 는 주요 절차 다.
    위의 프로그램 출력 에는 다음 과 같은 내용 이 있 습 니 다.
                            precision    recall  f1-score   support
    
               alt.atheism       0.94      0.82      0.87       319
             comp.graphics       0.88      0.98      0.92       389
                   sci.med       0.95      0.89      0.92       396
    soc.religion.christian       0.90      0.95      0.92       398
    
               avg / total       0.92      0.91      0.91      1502

    이것 은 SVM 분류 결과 보고서 입 니 다. 그 중에서:
  • 정확도 = 해당 분류 로 인식 되 는 정확 한 분류 기록 수 / 해당 분류 로 인식 되 는 기록 수
  • 리 콜 률 = 해당 분류 로 인식 되 는 정확 한 분류 기록 수 / 테스트 에 해당 분류 에 집 중 된 기록 총수
  • F1 - score = 2 (정확도 * 리 콜 율) / (정확도 + 리 콜 율), F1 - score 는 F - measure (일명 F - score) beta = 1 시의 특례
  • support = 테스트 집중 이 분류의 기록 총수
  • Out[59]: array([[261, 10, 12, 36], [ 5, 380, 2, 2], [ 7, 32, 353, 4], [ 6, 11, 4, 377]])
    이것 은 SVM 분류 결과 의 혼동 행렬 입 니 다. 모두 4 가지 가 있 기 때문에 4 * 4 의 행렬 입 니 다. 각 줄 의 모든 숫자 와 테스트 는 이 분류의 기록 총 수 를 집중 시 키 고 상기 보고서 의 support 값 과 같 습 니 다. 이 를 통 해 알 수 있 습 니 다.
  • 첫 번 째 유형 인 alt. atheism 은 261 개 로 분류 되 었 고 10 개 는 cop. graphics 에 나 뉘 었 으 며 12 개 는 sci. med 로 나 뉘 었 고 36 개 는 soc. religion. christian
  • 으로 나 뉘 었 다.
  • 두 번 째 유형의 cop. graphics 는 380 개의 정확 한 분류
  • 가 있다.
  • 세 번 째 유형 sci. med 는 353 개의 정확 한 분류
  • 가 있다.
  • 네 번 째 유형 soc. religion. christian 은 377 개의 정확 한 분류
  • 가 있다.
    컴퓨터 그래 픽 (cop. graphics) 에 비해 atheism (무신론) 과 christian (기독교) 은 잘못 분류 되 기 쉬 워 보인다.
    마지막 으로 사용 하 는 GridSearchCV 는 모든 매개 변수 조합 에 대해 점 수 를 매 기 며 가장 좋 은 매개 변 수 를 모델 의 매개 변수 로 합 니 다.

    좋은 웹페이지 즐겨찾기