#!/usr/bin/env python # coding: utf-8 # # 便利機能色々 # - utils # - feature_selection # - preprocess # 下ごしらえ # In[1]: import pandas as pd import numpy as np # In[2]: from sklearn.datasets import load_breast_cancer breast=load_breast_cancer() data=breast.data target=breast.target feature_name=breast.feature_names # dataをposiとnegaに分割しておく # In[3]: malignant=data[target==0] benign=data[target==1] # # 今回のお題 # ## 便利機能その1 utils # - utils.reshape # - utils.shuffle # In[4]: from sklearn import utils # breast_cancerのposiとnegaの比率を見てみると... # In[5]: for i,j in enumerate(breast.target_names): print("{}: {}".format(j,target[target==i].shape[0])) # 良性の患者がちょっと多め # posiとnegaからそれぞれresampleする # In[6]: malignant_resample=utils.resample(malignant,n_samples=200) benign_resample=utils.resample(benign,n_samples=200) # In[7]: print(benign_resample.shape) print(malignant_resample.shape) # 使うときはresampleした結果をmergeする(列方向に結合) # In[8]: # np.r_で列方向に結合できる。 data_resample=np.r_[malignant_resample,benign_resample] target_resample=np.r_[[0 for i in range(200)],[1 for i in range(200)]] # In[9]: print(data_resample.shape) print(target_resample.shape) # utils.shuffleの使い方 # In[10]: data_shuffle, target_shuffle = utils.shuffle(data_resample, target_resample) # In[11]: target_shuffle[0:10] # 関数を一個にまとめておかないとseedが変わってしまい、バラバラになってしまうので注意。 # ## 便利機能その2 # - feature_selection.SelectKBest # - feature_selection.SelectFromMedel # In[12]: from sklearn import feature_selection as fs # In[13]: selector=fs.SelectKBest(fs.chi2,k=3) selector.fit(data,target) pd.DataFrame(selector.transform(data)).head() # ざっくりというと、単変量解析して重要な特徴量を抽出する。 # (厳密には違うらしい) # 特徴量のスコアリングは下記が使える # - 回帰: f_regression, mutual_info_regression # - 分類: chi2, f_classif, mutual_info_classif # scores_に各特徴量のスコアも入っている。 # でも特徴量名をとってくるのはちょいと面倒。 # In[14]: pd.DataFrame(selector.scores_).T # In[15]: threshhold=sorted(selector.scores_,reverse=True)[3] print (threshhold) feature_name[selector.scores_>threshhold] # SelectPercentileは、同様にしてK%の特徴量を選択する。 # SelectFromModelを使うと、あるモデルで重要だった特徴量のみを抽出できる。 # In[16]: from sklearn.linear_model import ElasticNet en=ElasticNet().fit(data,target) # In[17]: selector_en=fs.SelectFromModel(en, prefit=True,threshold="mean") pd.DataFrame(selector_en.transform(data)).head() # 特徴量名を取ってきたいならこんな感じ。 # In[18]: feature_name[abs(selector_en.estimator.coef_)>selector_en.threshold_] # これ以上はドキュメントを参照。 # RFE(recursive feature elimination)などもある。 # http://scikit-learn.org/dev/modules/feature_selection.html # # 便利機能その3 joblib.dump/load # externalsはsklearn以外のライブラリでjoblibとsixが使える。 # joblib自体が便利。 # http://postd.cc/my-top-5-new-python-modules-of-2015/ # http://blog.kzfmix.com/entry/1460182592 # In[19]: from sklearn.externals import joblib # joblibのdumpとloadは、pickleよりも効率的に永続化できるらしいので、sklearnではモデルのsave/loadはこれを使う。 # In[20]: joblib.dump(selector, 'selector.pkl', compress=True) selector_2 = joblib.load('selector.pkl') # In[21]: selector_2 # # 便利機能その4 preprocessing # In[22]: from sklearn import preprocessing # preprocessもきりがないので、簡単なのだけ。 # preprocessはfitとtransformを一緒にやることがほとんどなので、fit_transformというメソッドがある。 # In[23]: # mean=0, std=1にスケーリング data_st=preprocessing.StandardScaler().fit_transform(data) # In[24]: plt.figure(figsize=(18, 6)) for i in range(0,9): plt.subplot(251+i) plt.scatter(data[:,i],data_st[:,i]) # 標準正規分布にスケーリング # In[25]: # これだけ問答無用で変換されてしまう pd.DataFrame(preprocessing.scale(data)).head() # ベクトルのノルムを正規化 # In[26]: pd.DataFrame(preprocessing.Normalizer(norm="l1").fit_transform(data)).head() # # おしまい # @y__sama