このガイドでは、Python による機械学習を使用して米国の住宅価格を予測する方法を説明します。まず、使用するデータセットについて説明し、次にデータを前処理します。その後、データセット内に存在する属性を視覚化し、トレーニング データセットにさまざまな機械学習アルゴリズムを適用します (ワシントン州シアトル、2022 年 8 月 – 2022 年 12 月)。最後に、テスト データセットに存在するいくつかの住宅の価格を予測してこのガイドを終了します。このプロジェクトを実装する前に、このプロジェクトで使用される機械学習の用語を理解する必要があります。
回帰
機械学習で数値データを扱う場合は、回帰を理解する必要があります。回帰は、独立属性と依存属性 (クラス ラベル/ターゲット) の間の関係を理解するために使用される機械学習の教師あり学習手法です。このマシンは、データセット内に存在する各レコードを学習することで住宅価格を予測します。したがって、それは教師あり学習です。
たとえば、このシナリオでは、独立した属性はベッドの数、風呂の数、土地の広さ、郵便番号などです。これらに基づいて住宅価格を予測できます。したがって、これらは何にも依存しない独立した属性です。価格は、これらの属性に依存するターゲット属性またはクラス ラベルです。
1. 線形回帰
線形回帰アルゴリズムは、依存属性 (Y) 変数と独立属性 (X) 変数間の線形関係を示します。数学的には、次のように評価できます。
そして = aX+b
ここで、「a」と「b」は線形係数です。
Python では、LinearRegression() は「sklearn.linear_model」モジュールで利用できます。プロジェクトの実装中にこれを指定する方法を見ていきます。以下はパラメーターを含むモデルです。
2. デシジョンツリー
基本的に、デシジョン ツリーは、ノードを使用して提供された条件に基づいて、問題に対して考えられるすべての解決策を取得するためのグラフィック表現です。 Decision ノードは意思決定を行うために使用され、Leaf ノードは特定の意思決定の出力を参照します。デシジョン ツリー リグレッサーを使用して家の価格を予測できます。
Python では、DecisionTreeRegressor は「sklearn.tree」モジュールで利用できます。プロジェクトの実装中にこれを指定する方法を見ていきます。以下はパラメーターを含むモデルです。
3. ランダムフォレスト
ランダム フォレストは、デシジョン ツリーと同様の機能を実行します。ただし、フォレスト (デシジョン ツリーのコレクション) を取得し、デシジョン ツリーのすべての出力を結合 (平均値) します。たとえば、ランダム フォレストのサイズは 3 です。したがって、内部的には 3 つのデシジョン ツリーが作成され、最初のデシジョン ツリーの住宅価格の結果は 20000 です。2 番目のデシジョン ツリーの住宅価格の結果は 20000 です。そして、最後のディシジョン ツリーは 10000 です。16,666.666 が最終結果 ((20000+20000+10000)/3) です。
Python では、RandomForestRegressor は「sklearn.ensemble」モジュールで利用できます。以下はパラメータを備えたモデルです。 「n_estimators」パラメータでツリーの数を指定できます。デフォルトでは 100 です。
実装
米国の住宅価格を予測する手順を簡単に確認できます。 2016 レコードを含む house_train (CSV ファイル) データセットを検討します (機械学習モデルのトレーニングに使用)。次に、house_test ファイルに存在する住宅の価格 (505) レコードを予測します。
1. トレーニング データセットとテスト データセットの読み込み
Pandas は、データ分析に使用される Python で利用可能なモジュールです。このモジュールを利用して、データセットを Python 環境にロードします。ここで使用するのは、 グーグル社 コード環境として。これは無料で利用できます。必要なのはGoogleアカウントだけです。
まず、ローカル PC から Colab Env にファイルをロードする必要があります。データセットを次からダウンロードします。 ここ 。
# house_train.csv ファイルと house_test.csv ファイルを Google Colab にアップロードします# 続々。
から グーグル。 他 輸入 ファイル
ファイル。 アップロード ( )
read_csv() は、CSV データを変数にロードするために使用される関数です。ファイル名をパラメータとして受け取ります。
輸入 パンダ# house_train.csv を train_data 変数にロードします
トレインデータ = パンダ。 read_csv ( 'houses_train.csv' )
# house_test.csv を test_data 変数にロードします
テストデータ = パンダ。 read_csv ( 「ハウステスト.csv」 )
# test_data を test_data1 変数に格納します
テストデータ1 = テストデータ
列と各列の非 null レコード数を確認してみましょう。 Pandas.DataFrame.info() は、この情報を取得するために使用されます。
印刷する ( トレインデータ。 情報 ( ) )印刷する ( テストデータ1。 情報 ( ) )
出力:
2. データの前処理
どちらのデータセットでも、「lot_size」列には sqft と acre の値が保持されます (「lot_size_unit」列の行を確認すると、差異がわかります)。ただし、形式は平方フィートである必要があります。したがって、「lot_size」列の値をエーカーから平方フィートに変換する必要があります。 「test_data1」についても同様に行います。
ここでは DataFrame.loc[] を使用して、「lot_size_units」と「acre」を見つけ、「lot_size」に存在する値に 43560 を乗算します。
# train_data の Lot_size エーカーの値を平方フィートに変換しますトレインデータ。 場所 [ ( トレインデータ [ 「ロットサイズ単位」 】 == 'エーカー' ) 、 'ロットサイズ' 】 = トレインデータ [ 'ロットサイズ' 】 * 43560
# test_data1 で、lot_size エーカーの値を平方フィートに変換します
テストデータ1。 場所 [ ( テストデータ1 [ 「ロットサイズ単位」 】 == 'エーカー' ) 、 'ロットサイズ' 】 = テストデータ1 [ 'ロットサイズ' 】 * 43560
印刷する ( トレインデータ。 頭 ( ) )
印刷する ( テストデータ1。 頭 ( ) )
出力:
これで、「lot_size」列のすべての値が平方フィート値であることがわかります。
この列には欠損値がいくつかあります。列に存在する NaN 値を、両方のデータセットの同じ列の平均値に置き換えてみましょう。
DataFrame[‘column_name’].fillna() は、mean() 関数を使用して欠損値を平均値で埋めるために使用されます。 DataFrame[‘column_name’].mean() はパラメーターとして finna() 関数に渡されます。平均を表示してカウントを見てみましょう。
# Lot_size 列に存在する欠損値を既存の値の平均値で埋めるトレインデータ [ 'ロットサイズ' 】 = トレインデータ [ 'ロットサイズ' 】 。 感じる ( トレインデータ [ 'ロットサイズ' 】 。 平均 ( ) )
# 平均値の表示
印刷する ( 「トレーニングデータの平均値:」 、 トレインデータ [ 'ロットサイズ' 】 。 平均 ( ) )
印刷する ( のみ ( トレインデータ [ 'ロットサイズ' 】 ) )
# Lot_size 列に存在する欠損値を既存の値の平均値で埋める
テストデータ1 [ 'ロットサイズ' 】 = テストデータ1 [ 'ロットサイズ' 】 。 感じる ( テストデータ1 [ 'ロットサイズ' 】 。 平均 ( ) )
# 平均値の表示
印刷する ( 「テストデータの平均値:」 、 テストデータ1 [ 'ロットサイズ' 】 。 平均 ( ) )
印刷する ( のみ ( テストデータ1 [ 'ロットサイズ' 】 ) )
出力:
トレーニング データセットの「lot_size」列に存在する欠損値は平均値 18789.95194 に置き換えられ、テスト データセットの「lot_size」列に存在する欠損値は平均値 8961.0 に置き換えられます。
3. データのクリーニング
モデルのトレーニング中に、結果の予測に必要のない不要な属性がいくつか存在します。この場合、両方のデータセットから削除される属性は「lot_size_units」、「zip_code」、「size_units」の 3 つです。 pandas.DataFrame.drop() は、両方のデータセットからこれら 3 つの列を削除するために使用されます。
トレインデータ = トレインデータ。 落とす ( [ 'ロットサイズ単位' 、 '郵便番号' 、 'サイズ単位' 】 、 軸 = 1 )テストデータ1 = テストデータ1。 落とす ( [ 'ロットサイズ単位' 、 '郵便番号' 、 'サイズ単位' 】 、 軸 = 1 )
印刷する ( トレインデータ。 情報 ( ) )
印刷する ( テストデータ1。 情報 ( ) )
出力:
現在、データセットは良好な状態になっています。不要な列は削除され、欠損値は存在しません。
4. データの視覚化
Train データの列のヒストグラムを作成してみましょう。 pandas.DataFrame.hist() 関数は、すべての属性のヒストグラムを生成するために使用されます。
トレインデータ。 履歴 ( 図サイズ = ( 4 、 9 ) )出力:
ヒストグラムは、トレーニング データのベッド、バス、サイズ、ロットサイズ、および価格の列に対して生成されます。
すべてのフィールドの相互の相関関係を作成しましょう。 Plotly.express モジュールは、相関値をプロットするために利用されます。
輸入 陰謀的に。 急行間違っています = トレインデータ。 間違っています ( )
# 相関データをプロットする
view_fig = 陰謀的に。 急行 。 イムショー ( 間違っています 、 text_auto = 真実 )
# 画面
view_fig. 見せる ( )
出力:
- ベッドは価格と 0.2935 の相関があり、lot_size と -0.059 の相関があり、サイズと 0.77 の相関があり、バスと 0.65 の相関があります。
- 風呂は価格と 0.3173 の相関があり、lot_size と -0.054 の相関があり、風呂と 0.667 の相関があり、ベッドとの相関は 0.771 です。
- サイズは、価格と相関する 0.444、lot_size と相関する -0.044、サイズと相関する 0.667、およびベッドと相関する 0.652 です。
5. モデルの準備
train_data から価格を削除して、ターゲットとして価格を設定する必要があります。このフェーズでは、トレーニング データとテスト データに存在する属性が同じであることを確認してください。
目標 = トレインデータ [ '価格' 】トレインデータ = トレインデータ。 落とす ( [ '価格' 】 、 軸 = 1 )
印刷する ( トレインデータ。 情報 ( ) )
印刷する ( テストデータ1。 情報 ( ) )
出力:
現在、4 つの独立した属性 (ベッド、バス、サイズ、ロットサイズ) があり、価格はこれら 4 つの属性に依存する依存属性です。
6. モデルのトレーニング
まず、RandomForestRegressor アルゴリズムを適用します。 「sklearn.ensemble」パッケージからインポートします。アンサンブル技法です。
- RandomForestRegressor() からモデルを作成します。このモデルにはパラメータを渡しません。したがって、デシジョン ツリーの数はデフォルトで 100 です。
- モデルを適合させるには、fit() メソッドを使用します。 2 つのパラメータを取ります。最初のパラメータは依存属性で、2 番目のパラメータはクラス ラベル/ターゲットです。
- モデルの精度を確認するには、score() メソッドを使用します。また、fit() メソッドと同様に同じパラメータを受け取ります。
# モデルを定義する
モデル1 = RandomForestRegressor ( )
# モデルを当てはめる
モデル1。 フィット ( トレインデータ 、 目標 )
# モデルの精度
印刷する ( モデル1。 スコア ( トレインデータ 、 目標 ) * 100 )
出力:
86.084008894190337. モデルをテストして結果を保存する
これは、結果を予測して保存する必要がある最後のステップです。
- detect() メソッドは、テスト データを予測するために使用されます。これはモデルで使用され、ネストされた値のリスト/DataFrame を受け取ります。
- to_csv() メソッドを使用して、結果を CSV ファイルに保存します。
- Python環境(Google Colab)からファイルをダウンロードします。
テストデータ [ '価格' ] = モデル1。 予測する ( テストデータ1 )
# test_data を test_results.csv に保存します
テストデータ。 to_csv ( 「テスト結果.csv」 )
# このファイルを Colab からダウンロードします
ファイル。 ダウンロード ( 「テスト結果.csv」 )
出力:
505 件のレコードのうち 20 件を表示してみましょう。 「Price」列には各住宅の予測値が保持されていることがわかります。
その他のモデル
DecisionTreeRegressor を使用して住宅を予測してみましょう。 「sklearn.tree」モジュールからインポートできます。
から 学んだ 木 輸入 デシジョンツリーリグレッサー# モデルを定義する
モデル2 = デシジョンツリーリグレッサー ( )
# モデルを当てはめる
モデル2。 フィット ( トレインデータ 、 目標 )
# モデルの精度
印刷する ( モデル2。 スコア ( トレインデータ 、 目標 ) * 100 )
# test_data1 を model1 で予測します。
テストデータ [ '価格' ] = モデル2。 予測する ( テストデータ1 )
# test_data を test_results.csv に保存します
テストデータ。 to_csv ( 「テスト結果.csv」 )
# このファイルを Colab からダウンロードします
ファイル。 ダウンロード ( 「テスト結果.csv」 )
出力:
99.94183165335028予測結果はここで確認できます。
LinearrEgression を使用して住宅を予測してみましょう。 「sklearn.linear_model」モジュールからモデルをインポートします。
から 学んだ 線形モデル 輸入 線形回帰# モデルを定義する
モデル3 = 線形回帰 ( )
# モデルを当てはめる
モデル3。 フィット ( トレインデータ 、 目標 )
# test_data1 を model1 で予測します。
テストデータ [ '価格' ] = モデル3。 予測する ( テストデータ1 )
# test_data を test_results.csv に保存します
テストデータ。 to_csv ( 「テスト結果.csv」 )
# このファイルを Colab からダウンロードします
ファイル。 ダウンロード ( 「テスト結果.csv」 )
予測結果はここで確認できます。
結論
部屋の数、土地の面積などの属性に基づいて住宅価格を予測できるようになりました。このガイドでは、ワシントン州シアトルの実際の住宅データを検討しました。線形回帰、デシジョン ツリー、ランダム フォレストなどの回帰手法を使用して、505 軒の住宅の価格を予測しました。モデルをトレーニングする前に実行する必要があるすべての手順 (データ前処理、データ クリーニング、データ視覚化) について、コード スニペットと出力を使用して段階的に説明します。