Chapter 2-データ前処理


記事の目次
  • 1.処理データフロー:
  • 1.pdはデータをロードし、データ構造を調べ、histは関係を描き、データを分析する.
  • .テストとトレーニングデータセットを作成する
  • .データ探索と可視化により、法則
  • が発見された.
  • .データ前処理
  • Pipeline実行フロー解析
  • 1.処理データフロー:
    1.pdデータを読み込み、データ構造を調べ、histが関係を描き、データを分析する.
    2.テストとトレーニングデータセットの作成
    from sklearn.model_selection import train_test_split
    
    train_set, test_set = trian_test_split(housing, test_size=0.2, random_state=42)
    
  • どうしてメディアンに対して.incomeは階層処理を行いますか?
    datasetが大きい場合、上述のランダムサンプリングの場合に望ましい.しかし、datasetが大きくない場合、上記の方法はサンプリング偏差のリスクがあります.
  • strathified samplingはある程度重要であるが、アプリケーションの前に、対応する特徴に応じて階層的に処理する.
  • [x]
  • housing['income_cat'] = np.ceil(housing['median_income'] / 1.5)
    housing.income_cat.where(housing.income_cat < 5, 5, inplace=True)
    
    from sklearn.model_selection import StratifiedShuffleSplit
    
    split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
    
    fro train_index, test_index in split.split(housing, housing['income_cat']):
        strat_train_set = housing.loc[train_index]
        strat_test_set = housing.loc[test_index]
        
    for set in (strat_train_set, strat_test_set):  # delete featuren of income_cat
        set.drop(['income_cat'], axis=1, inplace=True)
    
    3.データ探索と可視化、法則を発見するhousing = strat_ttrain_set.copy() # ,
  • は、いくつかのデータの一致を発見し、アルゴリズムにデータを提供する前に、それを除去する必要がある.また、いくつかの属性間の興味深い関連、特にターゲット属性を発見しました.また、いくつかの属性が長尾分布を持っていることにも注目して、それを変換することができます.もちろん、異なる項目の処理方法はそれぞれ違っていますが、大体の考えは似ています.
  • は主に図と目標要求によって関連データを調べます.
    4.データ前処理
  • (1)完全なデータセットを取得し、目標データlabelを元のdataと分離し、次の前処理のために
  • を準備する.
    housing = strat_train_set.drop("median_house_value", axis=1) # drop labels for training set
    housing_labels = strat_train_set["median_house_value"].copy()
    
  • (2)Nanを関連付けて充填する過程において、内部のアンumberではないatributesを全て除去することに注意します.SimpleImputerはnumberを計算するしかないので、
  • try:
        from sklearn.impute import SimpleImputer # Scikit-Learn 0.20+
    except ImportError:
        from sklearn.preprocessing import Imputer as SimpleImputer
    
    # create Imputer object
    imputer = SimpleImputer(strategy="median")  # using median 
    housing_num = housing.drop('ocean_proximity', axis=1)
    # alternatively: housing_num = housing.select_dtypes(include=[np.number])
    imputer.fit(housing_num)
    # transform the training set
    X = imputer.transform(housing_num)
    # cause the type of return value of imputer.transform is array, we need to tranform it into Dataframe
    housing_tr = pd.DataFrame(X, columns=housing_num.columns,
                              index=housing.index)
    
  • (3).分類データを処理して、txtタイプはOrdinalEncoderfit_transform()を採用して、テキスト類データをnumber型データに変換してslearn.preprocessingのOneHotEncoder独熱符号化を採用しています.上のコードは依然として後続のMachine Learning Algorithmに障害を生じます.例えば、分類の問題では、数字の大きさが違っていますので、4対1の距離より遠いNote:OneHot Encoder.fit_transform()は1-Dではなく、一般的に.reshape(-1, 1)で行列
  • に変換されます.
    # extract feature
    housing_cat = housing[['ocean_proximity']]  
    
    try:
        from sklearn.preprocessing import OrdinalEncoder
    except ImportError:
        from future_encoders import OrdinalEncoder # Scikit-Learn < 0.20
    
    # create OrdinalEncoder object
    ordinal_encoder = OrdinalEncoder()
    housing_cat_encoded = ordinal_encoder.fit_transform(housing_cat)
    
    try:
        from sklearn.preprocessing import OrdinalEncoder # just to raise an ImportError if Scikit-Learn < 0.20
        from sklearn.preprocessing import OneHotEncoder
    except ImportError:
        from future_encoders import OneHotEncoder # Scikit-Learn < 0.20
    
    cat_encoder = OneHotEncoder()
    housing_cat_1hot = cat_encoder.fit_transform(housing_cat)  # return sparse  array, we could use housing_cat_1hot.toarray() to create a dense array, like matrix.
    
  • (4)カスタム変換ここでフィーチャーNote that we need to set validate=False because the data contains non-float values (validate will default to False in Scikit-Learn 0.22).
  • をカスタマイズできます.
    from sklearn.preprocessing import FunctionTransformer
    
    # get the right column indices
    rooms_ix, bedrooms_ix, population_ix, household_ix = [
        list(housing.columns).index(col)
        for col in ("total_rooms", "total_bedrooms", "population", "households")]
        
    def add_extra_features(X, add_bedrooms_per_room=True):
        rooms_per_household = X[:, rooms_ix] / X[:, household_ix]
        population_per_household = X[:, population_ix] / X[:, household_ix]
        if add_bedrooms_per_room:
            bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix]
            return np.c_[X, rooms_per_household, population_per_household,
                         bedrooms_per_room]
        else:
            return np.c_[X, rooms_per_household, population_per_household]
    
    attr_adder = FunctionTransformer(add_extra_features, validate=False,
                                     kw_args={"add_bedrooms_per_room": False})
    housing_extra_attribs = attr_adder.fit_transform(housing.values)
    housing_extra_attribs = pd.DataFrame(
        housing_extra_attribs,
        columns=list(housing.columns)+["rooms_per_household", "population_per_household"],
        index=housing.index)
    
  • (5).変換ラインは、上記の変換を一定の流れに沿って行わせる.上述の変換は、slearnでPipelineを実行する時に、前のn-1項がFit__を呼び出すからである.transform、最後のアイテムの呼び出しfit.scii-learn公式文書管機構が機械学習アルゴリズムに適用される根源は,パラメータセットが新しいデータセット(たとえばテストセット)で繰り返し使用されることである.パイプライン機構は全てのステップに対するフロー式パッケージ化と管理を実現しました.注意:パイプラインの構造はプログラミング技術の革新のようで、アルゴリズムの革新ではない.Pipeline実行フロー分析Pipelineの中間過程は、scikit-learnに適応した変換器で構成され、最後のステップはestimatorである.例えば、Standard ScrearとPCA transformerはintermediate stepsを構成し、LogisticRegressionは最終的なestimartとして機能します.pipe_を実行する時lr.fitの場合、まずStandard Scarrerによってトレーニングセット上でfitとtransform方法を実行して、tranformed後のデータはまたPipelineオブジェクトの次のステップ、すなわちPCA()に渡されます.Standard Screarと同様に、PCAもfitとtransformを実行し、最終的に変換したデータをLosigsticRegressionに転送します.全体の流れは下の図の通りです.「外部チェーン写真の転載に失敗しました.ソースステーションは防犯チェーンのメカニズムがあるかもしれません.写真を保存して直接アップロードすることをお勧めします.(img-jzDG 9 ts C-1580134498614)」(evernotecid://CBA4164C-5A56-4141-899C-42B7F62EAC9F/appyinxiangcom/27727878/ENResource/p1)
  • from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import StandardScaler  # standardlisation
    
    # 1. fill is-null number, but when it occurs to txt, could be different
    # 2. add extra features
    # 3. standardlisation
    num_pipeline = Pipeline([
            ('imputer', SimpleImputer(strategy="median")),
            ('attribs_adder', FunctionTransformer(add_extra_features, validate=False)),
            ('std_scaler', StandardScaler()),
        ])
    
    housing_num_tr = num_pipeline.fit_transform(housing_num)
    
  • 住宅価格に上限が設けられていますが、処理する時は削除するかどうかに注意してください.
  • これらのヒストグラム分布は、左寄りに対して後続の変換によって正規分布に変化することができる.