第7章scikit-learnと機械学習の戦闘

1 scikit-learn

ナビゲーションページとアルゴリズムガイド
API:データの前処理と正規化、特徴抽出、特徴選択、さまざまなモデル:回帰用の一般化線形モデル(GLM)、ナイーブベイズ、サポートベクターマシン、ディシジョンツリー、クラスタリング、モデルチューニングとハイパーパラメーター選択:モデル選択、モデルの融合と拡張アンサンブル手法、モデル評価メトリクス

2プロジェクトの実際の戦闘

2.1プロジェクトの目標

カリフォルニア国勢調査データを使用して、カリフォルニアの住宅価格モデルを構築します。データには、各ブロックの人口、収入の中央値、住宅価格の中央値などの指標が含まれています。
データから学習し、他の指標に基づいて近隣の住宅価格の中央値を予測するモデルを構築したいと考えています。

2.2問題の定義

上司への最初の質問は、ビジネス目標は何かということです。
モデルの構築は、最終的な目標ではなく、企業がモデルをどのように使用するか、そしてモデルからどのように利益を得るかということです。上司から、モデルの出力が別のシステムに渡されると言われることがあります。
次の質問は:既存のプログラムはどれくらい効果的ですか?
システムの設計を開始します。教師あり学習、教師なし学習、強化学習のどれですか?それは分類ですか、それとも回帰ですか?
これは教師あり学習の問題です。ラベル付きのトレーニングサンプルデータ(住宅価格の中央値)を使用します。これは回帰の問題です。予測されるのは数値です。

2.3パフォーマンス指標の選択

回帰問題の場合、一般に、二乗平均平方根誤差(RMSE)がパフォーマンス指標として選択されます。

2.4仮説を検証する

ダウンストリームと通信して、必要な値(数値または分類)を決定します。

2.5データを取得する

  • データのダウンロード

データ構造を表示する

Housing.head()
housing.info()
housing.describe()
housing [“ ocean_proximity”]。value_counts()
housing.hist(bins = 50、figsize =(20,15))

  • データの説明を表示

データの量、各属性のタイプ、および空でない値の数に注目してください。データが切り捨てられているかどうかを確認してください。

  • テストセットを作成する

テストセットを毎回再収集すると、効果は非常に不安定になります。テストセットを保存するか、乱数生成シードを設定して、毎回同じテストセットを生成することができます。
さらに、テストセットがランダムにデータを選択する場合、それが代表的なものではない可能性があることに注意してください。たとえば、この例では、テストセットは高収入のグループをカバーしていない可能性があります。元のデータセットの収入の中央値の分布に従って、サンプリングデータを階層化する必要があります。StratifiedShuffleSplitを使用して実装できます。split = StratifiedShuffleSplit(n_splits = 1、test_size = 0.2、random_state = 42)

# Divide by 1.5 to limit the number of income categories
housing["income_cat"] = np.ceil(housing["median_income"] / 1.5)
# Label those above 5 as 5
housing["income_cat"].where(housing["income_cat"] < 5, 5.0, inplace=True)
from sklearn.model_selection import StratifiedShuffleSplit
# 提供分层抽样功能,确保每个标签对应的样本的比例
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for 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]

strat_test_set["income_cat"].value_counts() / len(strat_test_set)
housing["income_cat"].value_counts() / len(housing)
for set_ in (strat_train_set, strat_test_set):
    set_.drop("income_cat", axis=1, inplace=True)

テストセットと元のデータセットのincome_cat分布が一貫していることがわかります。

2.6データの探索と視覚化、および法の発見

処理するデータを全体的に理解している。
まず、テストを脇に置いて、それを理解していません。トレーニングセットが大きい場合は、探索セットをサンプリングできます。
次に、地理データを視覚化します。次に、
相関関係を見つけます。
パンダが提供するcorr_matrix = Housing.corr()メソッドを使用して、相関関係を表示します。
ここに画像の説明を挿入

収入の中央値と住宅価格の中央値には高い相関関係があります。分析の結果、500000、480000、350000などのいくつかの水平線は明らかに直線になることがわかりました。アルゴリズムがこれらの一致を繰り返さないようにするために、これらのブロックのデータ削除する必要がある場合があります

第四に、属性の組み合わせテスト

housing["rooms_per_household"] = housing["total_rooms"]/housing["households"]
housing["bedrooms_per_room"] = housing["total_bedrooms"]/housing["total_rooms"]
housing["population_per_household"]=housing["population"]/housing["households"]

属性の組み合わせは、脳の穴を開ける時間です。各世帯に複数の部屋、各部屋にいくつの寝室、各世帯の人数を設定することができます。

2.7機械学習アルゴリズムのデータを準備する

1何かをするためにいくつかの関数を書きます。
これらの関数は再利用できます。
2データのクリーニング
欠落データを処理する方法は3つあります:1欠落値のあるデータを(行ごとに)削除し、2属性全体を(列ごとに)削除し、3割り当てを実行します(0、平均、中央値など)
3テキストおよびカテゴリ属性の
処理テキスト属性の処理:最初にテキスト属性を数値属性に変換し、次にワンホットエンコーディング(OrdinalEncoder、OneHotEncoder、またはLabelBinarizer)を1つのステップで使用します。
4カスタムコンバーター
BaseEstimator、TransformerMixinを継承します。

class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
    def __init__(self, add_bedrooms_per_room = True): # no *args or **kargs
        self.add_bedrooms_per_room = add_bedrooms_per_room
    def fit(self, X, y=None):
        return self  # nothing else to do
    def transform(self, X, y=None):
        rooms_per_household = X[:, rooms_ix] / X[:, household_ix]
        population_per_household = X[:, population_ix] / X[:, household_ix]
        if self.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]

5機能のスケーリング
通常、ターゲット値をスケーリングしません。これは、スケーリングなしの住宅価格の中央値です。
特徴のスケーリングはトレーニングセットデータ用であり、テストセットと予測プロセスで同じ操作を実行する必要があります。
スケーリングには、正規化と標準化の2つの方法があります。
正規化演算は次のとおりです。x= x − minmax − minx = \ dfrac {x-min} {max-min}バツ=m a xm i nバツm i n、値の範囲は(0,1)です。ただし、外れ値の影響を大きく受けます。API:MinmaxScalerの
標準化操作は次のとおりです。x= x −平均分散x = \ dfrac {x-mean} {variance}バツ=二乗のバツM E N、値には範囲がなく、外れ値の影響が少なくなります。API:StandardScaler。

6変換パイプライン

from sklearn.base import BaseEstimator, TransformerMixin

# Create a class to select numerical or categorical columns 
# since Scikit-Learn doesn't handle DataFrames yet
class DataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names].values

num_attribs = list(housing_num)
cat_attribs = ["ocean_proximity"]

num_pipeline = Pipeline([
        ('selector', DataFrameSelector(num_attribs)),
        ('imputer', Imputer(strategy="median")),
        ('attribs_adder', CombinedAttributesAdder()),
        ('std_scaler', StandardScaler()),
    ])

cat_pipeline = Pipeline([
        ('selector', DataFrameSelector(cat_attribs)),
        ('cat_encoder', OneHotEncoder(sparse=False)),
    ])

from sklearn.pipeline import FeatureUnion

full_pipeline = FeatureUnion(transformer_list=[
        ("num_pipeline", num_pipeline),
        ("cat_pipeline", cat_pipeline),
    ])
housing_prepared = full_pipeline.fit_transform(housing)

2.8モデルを選択してトレーニングする

2.9モデルの微調整

2.10テストセットでのテスト

おすすめ

転載: blog.csdn.net/flying_all/article/details/113448533