Sklearn 모델 실 용 기법

7304 단어
1. 특징 향상
원시 데이터 의 종 류 는 여러 가지 가 있 는데 디지털 화 된 신호 데 이 터 를 제외 하고 대량의 기호 화 된 텍스트 도 있다. 그러나 우 리 는 기호 화 된 문자 자 체 를 계산 임무 에 직접 사용 할 수 없고 특정한 처리 수단 을 통 해 텍스트 를 특징 벡터 로 미리 계량 화하 고 기호 로 표시 하 는 특징 이 상대 적 으로 구조 화 되 었 으 며 문자 와 같은 데이터 구조 로 저장 해 야 한다.이때 우 리 는 DictVectorizer 를 사용 하여 특징 을 추출 하고 양 적 으로 한다. 예 를 들 어:
import pandas as pd
measurements = [
    {'city':'Dubai','temperature':33},
    {'city':'London','temperature':12},
    {'city':'San Francisco','temperature':18}
]
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
print(vec.fit_transform(measurements).toarray())
print(vec.get_feature_names())

#  
[[  1.   0.   0.  33.]
 [  0.   1.   0.  12.]
 [  0.   0.   1.  18.]]
['city=Dubai', 'city=London', 'city=San Francisco', 'temperature']

다른 일부 텍스트 데 이 터 는 더욱 직접적 이 고 특수 한 데이터 구 조 를 사용 하여 저장 하지 않 았 다. 단지 일련의 문자열 일 뿐이다. 우 리 는 이런 데 이 터 를 처리 할 때 자주 사용 하 는 텍스트 특징 표현 방법 은 단어 봉투 법 이다. 말 그대로 단어 가 나타 나 는 순 서 를 고려 하지 않 고 텍스트 에 나타 난 모든 어 휘 를 일련의 특징 으로 간주 할 뿐이다.우 리 는 이러한 중복 되 지 않 는 어휘 집합 을 어표 라 고 부 르 기 때문에 모든 훈련 텍스트 는 높 은 차원 의 어표 에서 하나의 벡터 를 발사 할 수 있 고 특징 수치의 계산 은 흔히 두 가지 방법 이 있다. CountVectorizer 와 TfidfVectorizer:
from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25,random_state=33)
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer()
X_count_train = vec.fit_transform(X_train)
X_count_test = vec.transform(X_test)

from sklearn.naive_bayes import MultinomialNB
mnb = MultinomialNB()
mnb.fit(X_count_train,y_train)
y_count_predict = mnb.predict(X_count_test)
from sklearn.metrics import classification_report
print('The accruacy of Naive Bayes is ',mnb.score(X_count_test,y_test))
print(classification_report(y_test,y_count_predict,target_names=news.target_names))

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer()
X_tfidf_train = tfidf_vec.fit_transform(X_train)
X_tfidf_test = tfidf_vec.transform(X_test)

from sklearn.naive_bayes import MultinomialNB
mnb = MultinomialNB()
mnb.fit(X_tfidf_train,y_train)
y_tfidf_predict = mnb.predict(X_tfidf_test)
from sklearn.metrics import classification_report
print('The accruacy of Naive Bayes is ',mnb.score(X_tfidf_test,y_test))
print(classification_report(y_test,y_tfidf_predict,target_names=news.target_names))

2. 특징 선별
특징 선별 은 PCA 와 같은 주성 분 을 선택 하여 특징 을 재건 하 는 방법 과 약간 차이 가 있 습 니 다. PCA 에 있어 우 리 는 재건 축 후의 특징 을 설명 할 수 없 지만 특징 선별 은 특징 치 에 대한 수정 이 존재 하지 않 고 모델 의 성능 향상 에 비교적 큰 소량의 특징 을 찾 는 데 중심 을 두 고 있 습 니 다. 우 리 는 sklearn 의 feature 를 사용 합 니 다.selection 모듈 에서 select Percentile 방법 은 효과 가 뚜렷 한 특징 부터 n 의 특징 을 선택 하여 특징 을 선별 합 니 다.
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
y = titanic['survived']
X = titanic.drop(['row.names','name','survived'],axis=1)
X['age'].fillna(X['age'].mean(),inplace=True)
X.fillna('UNKNOWN',inplace=True)

from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=33)
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
X_test = vec.transform(X_test.to_dict(orient='record'))
print (len(vec.feature_names_))

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(criterion='entropy')
dt.fit(X_train,y_train)
dt.score(X_test,y_test)

#   20%   
from sklearn import feature_selection
fs = feature_selection.SelectPercentile(feature_selection.chi2,percentile=20)
X_train_fs = fs.fit_transform(X_train,y_train)
dt.fit(X_train_fs,y_train)
X_test_fs = fs.transform(X_test)
dt.score(X_test_fs,y_test)

#         
from sklearn.cross_validation import cross_val_score
import numpy as np
percentiles = range(1,100,2)
results = []
for i in percentiles:
    fs = feature_selection.SelectPercentile(feature_selection.chi2,percentile=i)
    X_train_fs = fs.fit_transform(X_train,y_train)
    scores = cross_val_score(dt,X_train_fs,y_train,cv=5)
    results = np.append(results,scores.mean())
print (results)
#        
opt = np.where(results==results.max())[0][0]
print(opt)
print('Optimal number of features ',percentiles[opt])

3. 교차 검증
진정한 기계 학습 플랫폼 에서 기계 학습 임 무 를 실천 할 때 우 리 는 예측 결 과 를 제출 할 수 있 을 뿐 정 답 을 알 수 없다 는 것 을 알 게 될 것 이다. 그러면 우 리 는 기 존의 데 이 터 를 충분히 사용 해 야 한다. 일반적인 방법 을 할 때 기 존의 데 이 터 를 샘플링 분할 하고 일 부 는 모델 파라미터 훈련 에 사용 하 며 일 부 는 모델 설정 과 특징 선택 을 조절 하 는 데 사용 해 야 한다.또한 알 수 없 는 테스트 성능 을 평가 하 는 것 을 검증 집합 (Validation) 이 라 고 하 는데 검증 절차 의 복잡 도 에 따라 모델 검사 방식 은 하나의 검증 과 교차 검증 으로 나 뉜 다.
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
y = titanic['survived']
X = titanic.drop(['row.names','name','survived'],axis=1)
X['age'].fillna(X['age'].mean(),inplace=True)
X.fillna('UNKNOWN',inplace=True)

from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=33)
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
X_test = vec.transform(X_test.to_dict(orient='record'))

from sklearn.cross_validation import cross_val_score
fs = feature_selection.SelectPercentile(feature_selection.chi2,percentile=i)
X_train_fs = fs.fit_transform(X_train,y_train)
scores = cross_val_score(dt,X_train_fs,y_train,cv=5)
print (scores.mean())

4. 격자 검색
일반적인 상황 에서 모델 은 많은 매개 변 수 를 설정 해 야 한다. 이런 매개 변 수 는 우 리 는 일반적으로 모델 의 초 매개 변수 라 고 부른다. 예 를 들 어 K 근린 중의 K 값, 벡터 기 중의 서로 다른 핵 함수 등 을 지원 한다. 대부분 상황 에서 초 매개 변수의 선택 은 무한 하기 때문에 유한 한 시간 안에 인공 적 으로 몇 가지 초 매개 변수 조합 을 미리 설정 한 것 을 검증 할 수 있 는 것 을 제외 하고또한 계발 식 검색 방법 을 통 해 초 파라미터 조합 을 조정 할 수 있 는데 이런 계발 식 초 파라미터 검색 방법 을 격자 검색 이 라 고 부른다.
from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X_count_train = vec.fit_transform(X_train)
X_count_test = vec.transform(X_test)
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
#  pipeline        ,               
clf = Pipeline([
    ('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())
])

parameters = {
    'svc__gamma':np.logspace(-2,1,4),
    'svc__C':np.logspace(-1,1,3)
}

#n_jobs=-1          CPU
from sklearn.grid_search import GridSearchCV
gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1)

%time _=gs.fit(X_train,y_train)
print (gs.best_params_,gs.best_score_)
print (gs.score(X_test,y_test))

좋은 웹페이지 즐겨찾기