In [1]:
#sklearn_text_for_data_science
# sklearn
import numpy as np
import pandas as pd

# 欠損値を含む サンプルデータ・セットを作成
np.random.seed(0)
df = pd.DataFrame(np.random.randn(15).reshape(5,3))
df.loc[0,0] = np.nan
df.loc[1,1] = np.nan
df.loc[2,2] = np.nan
df
Out[1]:
0 1 2
0 NaN 0.400157 0.978738
1 2.240893 NaN -0.977278
2 0.950088 -0.151357 NaN
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
In [2]:
# 欠損値かどうかを調べる
df.isnull()
Out[2]:
0 1 2
0 True False False
1 False True False
2 False False True
3 False False False
4 False False False
In [3]:
# 欠損値を含むindexを削除する
df_dropna = df.dropna()
df_dropna
Out[3]:
0 1 2
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
In [4]:
# 欠損値を含むindexを meanで補完する
from sklearn.preprocessing import Imputer

# インスタンスを作成する
imp = Imputer(strategy='mean', axis=0)

#欠損値を分析して補完する
imp.fit(df)
imp.transform(df)
Out[4]:
array([[ 1.09065446,  0.40015721,  0.97873798],
       [ 2.2408932 ,  0.12862965, -0.97727788],
       [ 0.95008842, -0.15135721,  0.47489921],
       [ 0.4105985 ,  0.14404357,  1.45427351],
       [ 0.76103773,  0.12167502,  0.44386323]])
In [5]:
# カテゴリー変数をエンコーディングする

# サンプルDataFrame
dic = {0:[0, 1, 2, 3, 4],
       1:['a', 'b', 'a', 'b', 'c']}
df = pd.DataFrame(dic)
df
Out[5]:
0 1
0 0 a
1 1 b
2 2 a
3 3 b
4 4 c
In [6]:
# カテゴリー変数をラベルエンコーディングする

from sklearn.preprocessing import LabelEncoder

# LabelEncoderのインスタンスを作成する
le = LabelEncoder()
le.fit(df[1])
df[2] = le.transform(df[1]) # array([0, 1, 0, 1, 2])
df
Out[6]:
0 1 2
0 0 a 0
1 1 b 1
2 2 a 0
3 3 b 1
4 4 c 2
In [7]:
# カテゴリー変数を One-Hot ラベルエンコーディングする
'''
pd.get_dummieと同じ機能。
pd.get_dummieのほうが使いやすいのでおすすめ
'''
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

# サンプルDataFrame
dic = {'A':[0, 1, 2, 3, 4],
       'B':['a', 'b', 'a', 'b', 'c']}
df = pd.DataFrame(dic)

# DataFrameをコピー
df_ohe = df.copy()

df_ohe
Out[7]:
A B
0 0 a
1 1 b
2 2 a
3 3 b
4 4 c
In [8]:
# まず labelEncoder のインスタンスを作成
le = LabelEncoder()

# エンコードしたものを df_ohe[3]として新規作成する
df_ohe['B'] = le.fit_transform(df_ohe['B']) # a b c を含む列 を解析・変換
le.classes_

# OneHotEncoder のインスタンスを作成する
ohe = OneHotEncoder(categorical_features=[1]) # 変換する列の番号をリストとして指定する

# OneHotエンコーディングする
ohe.fit_transform(df_ohe).toarray() # .toarray():scipy.sparse形式からnumpy配列に変換
Out[8]:
array([[1., 0., 0., 0.],
       [0., 1., 0., 1.],
       [1., 0., 0., 2.],
       [0., 1., 0., 3.],
       [0., 0., 1., 4.]])
In [9]:
# 正規化
# 分散正規化 StanderdScaler
"""
x' = (x - mean)/ stdev
"""
from sklearn.preprocessing import StandardScaler

# サンプルDataFrameを生成する
df_dict = {'A':[1,2,3,4,5],
           'B':[100,200,300,400,500]}
df = pd.DataFrame(df_dict)

# スタンダードスケーラーのインスタンスを生成する
stdsc =  StandardScaler()

# 解析して変換する
stdsc.fit(df)
stdsc.transform(df)
Out[9]:
array([[-1.41421356, -1.41421356],
       [-0.70710678, -0.70710678],
       [ 0.        ,  0.        ],
       [ 0.70710678,  0.70710678],
       [ 1.41421356,  1.41421356]])
In [10]:
# 最小最大正規化 MinMaxScaler
"""
x' = (x - x_min) / (x_max - x\min)
"""
from sklearn.preprocessing import MinMaxScaler

# サンプルDataFrameを生成する
df_dict = {'A':[1,2,3,4,5],
           'B':[100,200,300,400,500]}
df = pd.DataFrame(df_dict)

# スタンダードスケーラーのインスタンスを生成する
mmsc =  MinMaxScaler()

# 解析して変換する
mmsc.fit(df)
mmsc.transform(df)
Out[10]:
array([[0.  , 0.  ],
       [0.25, 0.25],
       [0.5 , 0.5 ],
       [0.75, 0.75],
       [1.  , 1.  ]])