sklearn 학습 (1) 데이터 세트
당신 이 세월 을 남 겨 줄 수 있 는 것 은 세월 이 당신 에 게 남 겨 줄 수 있 는 것 은 더 좋 은 자신 을 제외 하고 다른 것 이 없습니다.
이보다 더 자신 이 공부 하도록 격려 할 수 있 는 것 이 무엇 입 니까?
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 개의 기록 이 있 고 모든 기록 은 하나의 문서 이다.이 문서 들 을 분류 하려 면 미리 처리 해 야 합 니 다. 두 가지 방법 이 있 습 니 다.
완전한 텍스트 분류의 예
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
위의 예:
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
위의 코드
위의 프로그램 출력 에는 다음 과 같은 내용 이 있 습 니 다.
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 분류 결과 보고서 입 니 다. 그 중에서:
이것 은 SVM 분류 결과 의 혼동 행렬 입 니 다. 모두 4 가지 가 있 기 때문에 4 * 4 의 행렬 입 니 다. 각 줄 의 모든 숫자 와 테스트 는 이 분류의 기록 총 수 를 집중 시 키 고 상기 보고서 의 support 값 과 같 습 니 다. 이 를 통 해 알 수 있 습 니 다.
컴퓨터 그래 픽 (cop. graphics) 에 비해 atheism (무신론) 과 christian (기독교) 은 잘못 분류 되 기 쉬 워 보인다.
마지막 으로 사용 하 는 GridSearchCV 는 모든 매개 변수 조합 에 대해 점 수 를 매 기 며 가장 좋 은 매개 변 수 를 모델 의 매개 변수 로 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.