데이터 파이썬 기계 학습 시각화 라이브러리 yellowbrick - 자습서를 탐험

배경

오버 동음 알고리즘뿐만 아니라, 내 실제 적용을위한 시각화하는 법을 배워야하기 matplotlib, 배우 sklearn 때, 시각화가 더 중요하지만, 사용 편의성 및 미적 감각은 정말 칭찬을하기 matplotlib. 그것은 완벽하게 술병과 결합 될 수 있기 때문에 점차적으로, 마지막으로 보케 고정 plotly, 시본을 사용, 어려운 간판 데이터는 훨씬 낮은 개발.

얼마 다시 데이터를보다 편리하게 탐색 할 수 있습니다이 라이브러리는 오늘 공간에 대해 배울 거라고 볼 수 있습니다. 상기 정신주의의 Google 번역, 영적 에너지의 적은 비용으로 점처럼 보이는 반 반 과학을 복사 할 수 있지만 원래 영어 문서는은, 중국이 할 것이 발견되었다, 액세스하고, 여전히 일부 문서 발견 꽤 같은 장소.

# http://www.scikit-yb.org/zh/latest/tutorial.html

모델 선택 가이드

이 튜토리얼에서, 우리는 모델을 Scikit이-배우고 우리의 데이터에 가장 적합한 모델을 선택하도록 비교 Yellowbrick에게 시각적 진단 도구를 사용하여 점의 다양한 볼 것이다.

모델 선택 트리플

기계 학습의 토론은 종종 선택 모델에 초점을 맞추었다. 는 로지스틱 회귀 분석, 임의 숲, 베이지안 방법, 또는 인공 신경망, 자신의 환경 설정을 보여 일반적으로 빠른 기계 학습 실무자되어 있는지 여부를 확인합니다. 이 때문에 주로 역사적인 이유이다. 현대 타사 라이브러리는 기계 학습 모델의 모든 종류의 배포를 만들기 위해 비록 사소한 것처럼 보이지만 전통적 경우에도 알고리즘을 조정 응용 프로그램과는 수년간의 연구를 필요로한다. 따라서, 다른 모델에 비해, 기계 학습 실무자 특정 (친숙한 될 가능성) 모델은 강한 선호를 가지고 경향이있다.

그러나이 모델은 단순히 선택 또는 "오류"알고리즘이 더 미묘한 것보다 "권리"를 선택합니다. 연습 흐름은 다음과 같습니다 :

选择和/或设计最小和最具预测性的特性集
从模型家族中选择一组算法,并且
优化算法超参数以优化性能。

첫째 2015 년 쿠마 등 SIGMOD 종이에 의해 제안 된 모델 선택 트리플. 자신의 논문에서, 예측 모델링 및 건축 차세대 데이터베이스 시스템의 개발에 대해 이야기합니다. 매우 적절에 기계 학습은 실제로는 매우 실험적인 한, 이러한 시스템을위한 긴급한 필요가 있다고 말했다. (모델 선택이 세배) 때문에 "모델 선택"그들이 설명, "그것은 매우있을 것이다 분석가 사전 (조합)에서 알 공간은 일반적으로 무제한, 종종 불가능하다, 반복 및 탐색하다 정확성 및 / 또는 통찰력에 만족. "

최근, 그리드 검색 방법을 통해 작업 흐름의 많은 자동화 표준화 된 API 및 GUI 기반 응용되고있다. 그러나 실제로 인간의 직관과 지침을보다 효과적으로 철저한 검색에 비해 모델의 품질에 초점을 맞출 수 있습니다. 공정 시각화 모델을 선택함으로써, 과학자들은 최종 데이터, 해석 모델 설정하고 함정을 피할 수 있습니다.

Yellowbrick 라이브러리는 데이터 과학자는 모델 선택 프로세스를 제어 할 수 있도록 시각적 진단 플랫폼을위한 학습 시스템입니다. 새로운 핵심 객체 Yellowbrick는 API를 Scikit이-알아 확장 : 비주얼. 비쥬얼함으로써 고차원 데이터의 변환 동안 비주얼 진단을 제공하는 매칭 변환 Scikit가 배우기 파이프 라인 프로세스의 일부로서 모델의 시각화를 허용한다.

데이터에 대한

이 튜토리얼은 UCI 기계 학습 저장소도 버섯 세트 버전에서 수정 된 사용합니다. 우리의 목표는 버섯 독성 또는 식용 예측하기 위해, 특정 버섯을 기반으로합니다.

이러한 데이터는 (아가리쿠스)에서 주름 버섯 목 Lepiota 및 샘플 정보를 대응 23 개 가족 구운 버섯 가설 (Lepiota)를 포함한다. 이들 각각은 절대 식용 독성 절대 식용 또는 미지 (독성 종의 클래스 조합으로)을 권장되지 것으로 판정된다.

우리의 문서 "아가리쿠스-lepiota.txt는"세 명목상 값 특성 정보 (4208, 3916 독성 식용)가 8124 대상 인스턴스 버섯이 포함되어 있습니다.

의이 팬더로 데이터를로드 할 수 있습니다.

import os
import pandas as pd
mushrooms = 'data/shrooms.csv'  # 数据集
dataset   = pd.read_csv(mushrooms)
# dataset.columns = names
dataset.head()

<div>
<스타일 범위>
.dataframe TBODY TR : 제 전용 형 {
수직 정렬 : 중간;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</ 스타일>
<표 테두리 = "1"클래스 = "dataframe">
<THEAD>
<TR 스타일 = "텍스트 정렬 : 오른쪽;">
<회> </ 일>
<제> ID </ 일>
<번째 > 클래스 </ 일>
<제> 캡 형상 </ 일>
<제> 캡 표면 </ 일>
<제> 캡 컬러 </ 일>
<제> 멍 </> 제
<제> 냄새 </ 회>
<제> 아가미 첨부 </> 제
<제> 아가미 간격 </ 일>
<> 아가미 크기 번째 </> 번째
> 일> ... </ 일 <
> 제 <하는 줄기 색 - 위 -Ring </ 일>
줄기 컬러 - 아래 링 </ 일> <회>
<제> 베일 형 </ 일>
<제> 베일 색 </ 일>
<제> 링 번호 </ 일>
링형 <회> </ 일>
포자 인쇄 색 <회> </ 일>
인구 <회> </ 일>
서식 <회> </ 일>
<번째 > 이름 : 24 </ 일>
</ TR>
</ THEAD>
<TBODY>
<TR>
<제> 0 </ 일>
<TD> 1 </ TD>
<TD> p </ TD>
<TD> X </ TD>
<TD> S </ TD>
<TD> N </ TD>
<TD> t </ TD>
<TD> p </ TD>
<TD> F </ TD>
<TD> C </ TD>
<TD> N </ TD>
<TD > ... </ TD>
<TD> w </ TD>
<TD> w </ TD>
<TD> p </ TD>
<TD> w </ TD>
<TD> O </ TD>
<TD > p </ TD>
<TD> K </ TD>
<TD> S </ TD>
<TD> U </ TD>
<TD> NaN이 </ TD>
</ TR>
<TR>
<제> 1 </ 일>
<TD> 2 </ TD>
<TD> E </ TD>
<TD> X </ TD>
<TD> S </ TD>
<TD> Y </ TD>
<TD > t </ TD>
<TD>을 </ TD>
<TD> F </ TD>
<TD> C </ TD>
<TD> B </ TD>
<TD> ... </ TD>
<TD> w </ TD>
<TD> w </ TD>
<TD> p </ TD>
<TD> w </ TD>
<TD> O </ TD>
<TD> p </ TD>
<TD> N </ TD>
<TD> N </ TD>
<TD> G </ TD>
<TD> NaN이 </ TD>
</ TR>
<TR>
<제> 2 </ 일>
<TD> 3 </ TD>
<TD> E </ TD>
<TD> B </ TD>
<TD> S </ TD>
<TD> w </ TD>
<TD> t < / TD>
<TD> L </ TD>
<TD> F </ TD>
<TD> C </ TD>
<TD> B </ TD>
<TD> ... </ TD>
<TD> <w / TD>
<TD> w </ TD>
<TD> p </ TD>
<TD> w </ TD>
<TD> O </ TD>
<TD> p </ TD>
<TD> N </ TD>
<TD > N </ TD>
<TD> m </ TD>
<TD> NaN이 </ TD>
</ TR>
<TR>
<일> 3 </> 번째
<TD> 4 </ TD>
<TD> p </ TD>
<TD> X </ TD>
<TD> Y </ TD>
<TD> w </ TD>
<TD> t </ TD>
<TD > p </ TD>
<TD> F </ TD>
<TD> C </ TD>
<TD> N </ TD>
<TD> ... </ TD>
<TD> w </ TD>
<TD > w </ TD>
<TD> p </ TD>
<TD> w </ TD>
<TD> O </ TD>
<TD> p </ TD>
<TD> K </ TD>
<TD> S </ TD>
<TD> U </ TD>
<TD> NaN이 </ TD>
</ TR>
<TR>
<일> 4 </ 일>
<TD> 5 </ TD>
<TD> E </ TD >
<TD> X </ TD>
<TD> S </ TD>
<TD> G </ TD>
<TD> F </ TD>
<TD> N </ TD>
<TD> F </ TD>
<TD > w </ TD>
<TD> B </ TD>
<TD> ... </ TD>
<TD> w </ TD>
<TD> w </ TD>
<TD> p </ TD>
<TD> w </ TD>
<TD> O </ TD>
<TD> E </ TD>
<TD> N </ TD>
<TD>을 </ TD>
<TD > G </ TD>
<TD> NaN이 </ TD>
</ TR>
</ TBODY>
</ 테이블>
<25 열 × p> 5 행 </ p>
</ div>

features = ['cap-shape', 'cap-surface', 'cap-color']
target   = ['class']
X = dataset[features]
y = dataset[target]
dataset.shape # 较官方文档少了俩蘑菇
(8122, 25)
dataset.groupby('class').count() # 各少了1个蘑菇

<div>
<스타일 범위>
.dataframe TBODY TR : 제 전용 형 {
수직 정렬 : 중간;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</ 스타일>
<표 테두리 = "1"클래스 = "dataframe">
<THEAD>
<TR 스타일 = "텍스트 정렬 : 오른쪽;">
<회> </ 일>
<제> ID </ 일>
<번째 > 캡 형상 </ 일>
<제> 캡 표면 </ 일>
<제> 캡 컬러 </ 일>
<제> 멍 </> 일
> 일> 냄새 </ 일 <
> 아가미 부착 번째 < </ 일>
<제> 아가미 간격 </ 일>
아가미 크기 <회> </ 일>
아가미 색 <회> </ 일>
<제 /> ... <회>
<제> 줄기 컬러 -above 링 </ 일>
<제> 줄기 컬러 - 아래 링 </ 일>
<제> 베일 형 </ 일>
<제> 베일 색 </ 일>
<제> 링 번호 </ 일>
링형 <회> </ 일>
포자 인쇄 색 <회> </ 일>
인구 <회> </ 일>
서식 <회> </ 일>
<번째 > 이름 : 24 </ 일>
</ TR>
<TR>
<제> 클래스 </ 일>
<회> </ 일>
<회> </ 일>
<회> </ 일>
<회> </ 일>
<회> </ 일>
<회> < / 일>
<회> </ 일>
<회> </ 일>
<회> </ 일>
<회> </ 일>
<회> </ 일>
<> 일> </ 일
일 <> </ 회>
<제> </ 일>
<회> </ 일>
<회> </ 일>
<회> </ 일>
<회> </ 일>
<회> </> 제
<> </ 일 번째 >
<회> </ 일>
</ TR>
</ THEAD>
<TBODY>
<TR>
<> 번째E </ 일>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 < / TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> ... </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 4207 </ TD>
<TD> 0 </ TD>
</ TR>
<TR>
<> p </ 일> 제
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 < / TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD>3915 </ TD>
<TD> ... </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 3915 </ TD>
<TD> 0 </ TD>
</ TR>
</ TBODY>
</ 테이블>
24 열 × <p> 2 행 </ p>
</ div>

특징 추출

대상 매개 변수를 포함하여 우리의 데이터는 범주 형 데이터입니다. 기계 학습을 사용하기 위해, 우리는 수치 데이터로이 값이 필요합니다. 데이터에서이 농축 된 추출물에, 우리는 컨버터를 Scikit이-알아 사용해야합니다 (변압기) 모델 데이터 세트에 설정된 입력 데이터로 변환된다. 다행히, 정수 범주 레이블을 변환하는 컨버터를 제공 Sckit는-알아보기 : sklearn.preprocessing.LabelEncoder합니다. 불행하게도, 그것은 단지 벡터를 변환 할 수 있습니다, 그래서 여러 컬럼에 적용되도록 우리는 그것을 조정할해야합니다.
의심,이 버섯 분류 벡터이다?

from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
class EncodeCategorical(BaseEstimator, TransformerMixin):
    """
    Encodes a specified list of columns or all columns if None.
    """

    def __init__(self, columns=None):
        self.columns  = [col for col in columns]
        self.encoders = None

    def fit(self, data, target=None):
        """
        Expects a data frame with named columns to encode.
        """
        # Encode all columns if columns is None
        if self.columns is None:
            self.columns = data.columns

        # Fit a label encoder for each column in the data frame
        self.encoders = {
            column: LabelEncoder().fit(data[column])
            for column in self.columns
        }
        return self

    def transform(self, data):
        """
        Uses the encoders to transform a data frame.
        """
        output = data.copy()
        for column, encoder in self.encoders.items():
            output[column] = encoder.transform(data[column])

        return output

모델링 및 평가

공통 지표 분류를 평가하기

정확성 (정밀)의 수는 긍정적 인 결과의 숫자로 나눈 사실 긍정적 인 결과이다 (예를 들어, 우리는 얼마나 많은 실제로 식용 버섯을 예측?)

리콜 (회수)의 긍정적 인 결과의 수는 리턴 된 횟수로 나눈 정확한 긍정적 인 결과이다 (예를 들어, 우리는 정확하게 유독 얼마나 많은 유독 한 버섯입니다 예측?)

F1 분획 (F1 점수) 시험 규격의 정확도의 척도이다. 또한 정밀도와 리콜 시험에 대한 점수를 계산합니다. F1 점수는 1에서 F1 점수가 최악의 값이 0이 최적 값에 도달 정밀도와 재현율의 가중 평균으로서 해석 될 수있다.
정밀 = 진정한 양성 / (참 긍정 + 잘못된 반응)

리콜 = 진정한 양성 / (위음성 + 진정한 양성)

2 = F1 점수 ((정밀 리콜) / (정밀 + 리콜))
이제 우리는 몇 가지 예측 할 준비가!

처음 사용하는 기존의 수치 점수 (우리가 나중에 시각적 진단 Yellowbrick 라이브러리와 비교합니다) -의 여러 추정 (여러 추정량)을 평가하는 방법을 구축하자.

from sklearn.metrics import f1_score
from sklearn.pipeline import Pipeline
def model_selection(X, y, estimator):
    """
    Test various estimators.
    """
    y = LabelEncoder().fit_transform(y.values.ravel())
    model = Pipeline([
         ('label_encoding', EncodeCategorical(X.keys())),
         ('one_hot_encoder', OneHotEncoder(categories='auto')),  # 此处增加自动分类,否则有warning
         ('estimator', estimator)
    ])

    # Instantiate the classification model and visualizer
    model.fit(X, y)

    expected  = y
    predicted = model.predict(X)

    # Compute and return the F1 score (the harmonic mean of precision and recall)
    return (f1_score(expected, predicted))
from sklearn.svm import LinearSVC, NuSVC, SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegressionCV, LogisticRegression, SGDClassifier
from sklearn.ensemble import BaggingClassifier, ExtraTreesClassifier, RandomForestClassifier
model_selection(X, y, LinearSVC())
0.6582119537920643
import warnings
warnings.filterwarnings("ignore", category=FutureWarning, module="sklearn")  # 忽略警告
model_selection(X, y, NuSVC())
0.6878837238441299
model_selection(X, y, SVC())
0.6625145971195017
model_selection(X, y, SGDClassifier())
0.5738408700629649
model_selection(X, y, KNeighborsClassifier())
0.6856846473029046
model_selection(X, y, LogisticRegressionCV())
0.6582119537920643
model_selection(X, y, LogisticRegression())
0.6578749058025622
model_selection(X, y, BaggingClassifier())
0.6873901878632248
model_selection(X, y, ExtraTreesClassifier())
0.6872294372294372
model_selection(X, y, RandomForestClassifier())
0.6992081007399714

예비 평가 모델

위의 분수 F1, 모델 최적의 성능 결과에 따르면?

비주얼 모델 평가

이제, 정밀도, 리콜 및 F1 점수를 보여주는 모델 시각화 도구입니다 ClassificationReport 클래스의 Yellowbrick를 사용하여, 재건 모델 평가 기능을 할 수 있습니다. 이 오류의 첫 번째 유형의 유스 케이스 (삶과 죽음!) (유형 I 오류)와 관련이 특히 단순한 탐지를 설명하고 지원하는 모델 분석 도구 통합 스코어 값의 시각화, 색상 코딩 열역학적 다이어그램 및 제 오류 유형 (유형 II 에러) 뉘앙스.

제 에러의 종류 (또는 「위양성 (위양성)는 ") (버섯 실제로 식용 때 예를 들면, 그 독성) 비 검출 가능한 효과가 존재한다.

유형 II 오류 (또는 "false 네거티브" "위음성")는 효과의 존재 감지 할 수 없습니다 (때 실제로 유독 버섯, 예를 들어,하지만 그것은 식용).

from sklearn.pipeline import Pipeline
from yellowbrick.classifier import ClassificationReport

def visual_model_selection(X, y, estimator):
    """
    Test various estimators.
    """
    y = LabelEncoder().fit_transform(y.values.ravel())
    model = Pipeline([
         ('label_encoding', EncodeCategorical(X.keys())),
         ('one_hot_encoder', OneHotEncoder()),
         ('estimator', estimator)
    ])

    # Instantiate the classification model and visualizer
    visualizer = ClassificationReport(model, classes=['edible', 'poisonous'])
    visualizer.fit(X, y)
    visualizer.score(X, y)
    visualizer.poof()
visual_model_selection(X, y, LinearSVC())

파일

# 其他分类器可视化略
visual_model_selection(X, y, RandomForestClassifier())

파일

테스트

现在,哪种模型看起来最好?为什么?
哪一个模型最有可能救你的命?
可视化模型评估与数值模型评价,体验起来有何不同?

정밀 리콜은 정확성과 종합 평가 지수 측정 F1 기억
http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%83%AD%E6% 87 % 96 / 437.shtml
F1 점수 정밀도를 고려한 비율을 기억.
잘 직관적 인 시각화 ~ 탈출하다

저자에 관하여

좋은 영약 + MongoDB를 + SKlearn + 보케이 시대의 거의 yeayee, Py를 오년을 알고

추천

출처blog.51cto.com/14509091/2431116