家賃決定問題を用いてK近傍法アルゴリズムを学ぶ

家賃決定問題を用いてK近傍法アルゴリズムを学ぶ

[[405033]]

k 近傍法の考え方は、私の意見では最も純粋で明確な考え方であり、k 近傍法アルゴリズム (KNN) は、この考え方をデータ分野に適用したものにすぎません。

あなたの給料はあなたの周りの人々によって決まります。

あなたのレベルは、あなたに最も近い人々のレベルによって決まります。

あなたが見る世界は、あなたの周りの人々によって決まります。

思考は思考です。エンコードできなければ、データサイエンスの分野に適用することはできません。

質問をし、その方法を適用して問題を解決することで、方法の理解を深めます。

質問: Airbnb プラットフォームの家主の場合、家賃はどのように設定しますか?

分析: 入居者は、主に価格、寝室数、家屋タイプ、場所などを含む Airbnb プラットフォーム上の賃貸情報に基づいて、満足できる家屋を選択します。家賃は市場の動向と密接に関係しています。同じタイプの家でも家賃が高すぎると、入居者は間違いなく借りてくれません。家賃が低すぎると、利益は上がりません。

回答: 私たちの家と似た条件の家をいくつか集めて、最も似ている家を特定し、それらの価格の平均を計算して、私たちの家の家賃として使用します。

これは K 最近傍法 (KNN)、つまり k 最近傍アルゴリズムです。 KNN の中心的な考え方は、ラベル付けされていないサンプルのカテゴリが、その k 個の最近傍による投票によって決定されるというものです。

この記事では、家賃価格設定の問題に基づいてこのアルゴリズムを適用するプロセス全体を整理します。これには次の部分が含まれます。

  1. データの読み込み
  2. データ処理
  3. 手書きアルゴリズムコード予測
  4. モデル予測にsklearnを使用する
  5. ハイパーパラメータの最適化
  6. クロス検証
  7. 要約する

このデータセットは公開されていることをあらかじめ述べておきます。インターネット上では関連トピックに関する資料が多数見つかります。この記事では、それを完全かつ正確に説明することを目指しています。より詳細な学習資料が見つかったら、大変助かります。

1. データを読み込む

まず、データを読み込んで、データの状況を把握します。ターゲット変数 price、cleaning_fee、security_deposit の形式に問題があることがわかります。他の変数は文字型であるため、処理する必要があります。見やすくするためにデータフレームを転置しました。

2. データ処理

まず価格のみを扱い、アルゴリズムのアイデア自体に焦点を当ててみます。

  1. # ターゲット変数価格を処理し、数値型に変換します
  2. カンマを削除 = dc_listings[ 'price' ].str.replace ( ' ,' , '' )
  3. stripped_dollars = stripped_commas.str.replace ( '$' , '' )
  4. dc_listings[ 'price' ] = stripped_dollars.astype( 'float' )
  5.  
  6. # k近傍法もモデルであり、トレーニングセットとテストセットを分割する必要がある。
  7. サンプル番号 = len(dc_listings)
  8. # ここでは、データセットがランダムかつ効果的に分割されるように、まずデータをランダムに分割します。
  9. dc_listings = dc_listings.loc[np.random.permutation(len(sample_num))]
  10. train_df = dc_listings.iloc[0: int (0.7*sample_num)]
  11. test_df = dc_listings.iloc[ int (0.7*sample_num):]

3. 手書きアルゴリズムコード予測

k 最近傍アルゴリズムの定義に従って直接コードを記述します。簡潔さと効率性のため、単一の変数に対してのみ予測を行います。

家に住む人数は家賃と高い相関関係にある情報であるはずであり、エリアも同様であるはずです。ここでは前者を採用します。

私たちの目標はアルゴリズムのロジックを理解することです。実際の操作では、通常、単一の変数のみが考慮されるわけではありません。

  1. # 注意: これは train_df です
  2. def predict_price(new_listing):
  3. temp_df = train_df.copy()
  4. temp_df[ '距離' ] = temp_df[ '収容' ].apply(lambda x: np.abs ( x - new_listing))
  5. temp_df = temp_df.sort_values( '距離' )
  6. 最も近い価格 = temp_df.iloc[0:5][ '価格' ]
  7. 予測価格 = 最近隣価格.mean()
  8. リターン(予測価格)
  9.  
  10. # ここはtest_dfです
  11. test_df[ '予測価格' ] = test_df[ '収容可能' ].apply(予測価格)
  12. # MAE(平均絶対誤差)、MSE(平均二乗誤差)、RMSE(平均二乗誤差)
  13. test_df[ 'squared_error' ] = (test_df[ 'predicted_price' ] - test_df[ 'price' ])**(2)
  14. mse = test_df[ 'squared_error' ].mean()
  15. rmse = mse ** (1/2)

モデル アルゴリズムの構築はトレーニング セットに基づいており、予測評価はテスト セットに基づいていることを強調しておく価値があります。厳密に言えば、アプリケーション評価には、クロスタイム サンプルという別の種類のサンプルがあります。

結果から判断すると、変数調整のみを使用して最近傍選択を行う場合でも、予測結果は依然として非常に効果的です。

4. モデル予測にsklearnを使用する

今回は、文字列と説明のない変数のみを削除し、使用できる残りの変数をすべて使用して、さらに多くの変数を使用します。

複数の変数を使用する場合、これらの不変量の次元は異なるため、標準化する必要があります。変数を重ね合わせることができることを保証しながら、各変数の分布の違いを保証します。

  1. # 数値以外の変数と不適切な変数を削除する
  2. drop_columns = [ '部屋タイプ' '都市' '州' '緯度' '経度' '郵便番号' 'ホスト応答率' 'ホスト承認率' 'ホストリスト数' ]
  3. dc_listings = dc_listings.drop (drop_columns、軸=1 )
  4. # 欠損率が高すぎる列(変数)を削除する
  5. dc_listings = dc_listings.drop ([ '清掃料' , '保証金' ], axis=1 )
  6. # 欠損値のある行(サンプル)を削除する
  7. dc_listings = dc_listings.dropna(軸=0)
  8. # 複数の変数は異なる次元を持ち、標準化する必要がある
  9. 正規化されたリスト = (dc_listings - dc_listings.mean())/(dc_listings.std())
  10. normalized_listings[ '価格' ] = dc_listings[ '価格' ]
  11.  
  12. # モデリングに使用できるデータセットが7:3でトレーニングセットとテストセットに分割されました
  13. train_df = 正規化されたリスト.iloc[0: int (0.7*len(正規化されたリスト))]
  14. test_df = normalized_listings.iloc[ int (0.7*len(normalized_listings)):]
  15. # 価格はy、残りの変数はXです
  16. 特徴 = train_df.columns.tolist()
  17. 機能を削除します( '価格' )

処理されたデータセットは次のとおりです。ここで、price は予測するターゲットであり、残りは利用可能な変数です。

  1. sklearn.neighborsからKNeighborsRegressor をインポートします
  2. sklearn.metricsからmean_squared_errorをインポートする
  3.  
  4. knn = KNeighborsRegressor(n_neighbors=5, アルゴリズム= 'brute' )
  5. knn.fit(train_df[特徴], train_df[ '価格' ])
  6. 予測 = knn.predict(test_df[特徴])
  7. mse = 平均二乗誤差(test_df[ '価格' ], 予測)
  8. rmse = mse ** (1/2)

最終的なrmse = 111.9は単変量knnの117.4よりも小さく、結果は最適化されています。厳密に言えば、この比較は、特徴が欠落している少数のサンプルが失われたため、完全に公平ではありません。

5. ハイパーパラメータの最適化

パート 3 と 4 では、k = 5 と仮定しましたが、これは衝動的な決定でした。この値が妥当かつ最適であるかどうかは、さらに判断する必要があります。

このうち、この k はハイパーパラメータです。どのデータ セットでも、knn を使用する限り、k 値を決定する必要があります。

k 値はデータに基づいてモデルによって学習されるのではなく、事前に設定され、結果に基づいて逆選択によって決定されます。あらゆるハイパーパラメータはこのように決定され、他のアルゴリズムでも同様です。

  1. matplotlib.pyplot をpltとしてインポートします。
  2. %matplotlib インライン
  3.  
  4. hyper_params = [x が範囲(1,21)内の場合のx ]
  5. rmse_values = []
  6. 特徴 = train_df.columns.tolist()
  7. 機能を削除します( '価格' )
  8.  
  9. hyper_paramshpの場合:
  10. knn = KNeighborsRegressor(n_neighbors=hp、アルゴリズム= 'brute' )
  11. knn.fit(train_df[特徴], train_df[ '価格' ])
  12. 予測 = knn.predict(test_df[特徴])
  13. mse = 平均二乗誤差(test_df[ '価格' ], 予測)
  14. rmse = mse**(1/2)
  15. rmse_values.append(rmse)
  16.      
  17. plt.plot(hyper_params、rmse_values、c= 'r' 、線種= '-' 、マーカー= '+' )

k が大きいほど、トレンドに関して予測価格と実際の価格の偏差がより正確になることがわかりました。ただし、k が大きくなるほど、計算量も大きくなることに注意してください。

k 値を決定するときは、アルボー法を使用できます。つまり、上の図の変曲点、つまり比喩的に手の肘に注目します。

k=5 よりも k=7 または 10 の方が良い結果になる可能性があります。

6. クロスバリデーション

上記の計算結果は、トレーニング セットとテスト セットの分割においてランダム性を考慮していますが、完全にそれらに依存しています。しかし、特にサンプルサイズが十分に大きくない場合は、単一の結果が偶然である可能性があります。

クロス検証はこの問題を解決するために設計されています。同じサンプル セットを異なるトレーニング セットとテスト セットに分割できます。各分割ごとに再トレーニングと予測を実行し、結果を総合的に確認します。

最も広く使用されているのは n 倍交差検証であり、これはデータ セットをランダムに n 個の部分に分割し、n-1 個のサブセットをトレーニング セットとして使用し、残りの 1 つのサブセットをテスト セットとして使用するものです。このようにして、合計 n 回のトレーニングと予測を実行できます。

次のように、ロジックを直接手動で記述できます。

  1. サンプル数 = len(正規化されたリスト)
  2. normalized_listings.loc[ normalized_listings.index [0: int (0.2*sample_num)], "fold" ] = 1
  3. normalized_listings.loc[normalized_listings.index [ int ( 0.2*sample_num): int (0.4*sample_num)], "fold" ] = 2
  4. normalized_listings.loc[normalized_listings.index [ int ( 0.4*sample_num): int (0.6*sample_num)], "fold" ] = 3
  5. normalized_listings.loc[normalized_listings.index [ int ( 0.6*sample_num): int (0.8*sample_num)], "fold" ] = 4
  6. normalized_listings.loc[normalized_listings.index [ int ( 0.8*sample_num ):], "fold" ] = 5
  7.  
  8. 折り畳みID = [1,2,3,4,5]
  9. def train_and_validate(df, 折り畳み):
  10. 折り畳み率 = []
  11. 折り畳み場合:
  12. # 電車
  13. モデル = KNeighborsRegressor()
  14. 訓練 = df[df[ "折り畳み" ] != 折り畳み]
  15. テスト = df[df[ "fold" ] == fold].copy()
  16. model.fit(train[特徴], train[ "価格" ])
  17. # 予測する
  18. ラベル = model.predict(テスト[特徴])
  19. test[ "predicted_price" ] = ラベル
  20. mse = 平均二乗誤差(テスト[ "価格" ], テスト[ "予測価格" ])
  21. rmse = mse**(1/2)
  22. fold_rmses.append(rmse)
  23. 戻り値(fold_rmses)
  24.  
  25. rmses = train_and_validate(正規化されたリスト、fold_ids)
  26. 平均rmse = np.mean(rmses)

エンジニアリングでは、ツールとリソースを最大限に活用する必要があります。 sklearn ライブラリには、一般的に使用される機械学習アルゴリズムの実装が含まれており、検証に直接使用できます。

  1. sklearn.model_selectionからcross_val_score、KFold をインポートします
  2. kf = KFold(5, シャッフル= True , ランダム状態= 1)
  3. モデル = KNeighborsRegressor()
  4. mses = cross_val_score(モデル、正規化されたリスト[機能]、正規化されたリスト[ "価格" ]、スコアリング= "負の平均二乗誤差" 、cv=kf)
  5. rmses = np.sqrt( np.absolute (mses))
  6. 平均rmse = np.mean(rmses)

クロス検証の結果により、特に小規模なデータセットでは信頼性が高まります。偶発的なエラーをある程度軽減できるからです。

クロス検証とハイパーパラメータ最適化を組み合わせると、通常、このデータセットでは knn アルゴリズムによって予測される最良の結果が得られます。

  1. # ハイパーパラメータの最適化
  2. num_folds = [x が範囲(2,50,2)内の場合のx ]
  3. rmse_values ​​= []
  4.  
  5. num_folds折り畳みの場合:
  6. kf = KFold(fold、シャッフル= True 、ランダム状態= 1)
  7. モデル = KNeighborsRegressor()
  8. mses = cross_val_score(モデル、正規化されたリスト[機能]、正規化されたリスト[ "価格" ]、スコアリング= "負の平均二乗誤差" 、cv=kf)
  9. rmses = np.sqrt( np.absolute (mses))
  10. 平均rmse = np.mean(rmses)
  11. std_rmse = np.std(rmses)
  12. rmse_values.append(平均rmse)
  13.      
  14. plt.plot(num_folds, rmse_values, c= 'r' , 線種= '-' , マーカー= '+' )

同じ傾向が見られ、k が大きいほど効果は高くなります。同時に、クロスバリデーションによって過剰適合の問題がある程度解決されるため、理想的な k 値が大きいほど、モデルはより複雑になる可能性があります。

7. まとめ

k近傍法アルゴリズムの核となる考え方と上記のコーディングプロセスから、このアルゴリズムはトレーニング セット内のインスタンスに完全に依存するため、インスタンス ベースの学習方法であることがわかります。

このアルゴリズムは数学的な手法を必要とせず、理解しやすいものです。しかし、k 最近傍アルゴリズムの各予測では、トレーニング セット全体のデータから予測対象のデータまでの距離を計算し、それを昇順に並べる必要があり、膨大な計算量が必要になるため、大規模なデータ セットへの適用には適していません。

数学関数を使用してデータセットの特性変数とターゲット変数の関係を記述できる場合、トレーニング セットを使用して関数表現を取得すると、予測は単純な数学計算問題になります。計算の複雑さが大幅に軽減されます。

他の古典的な機械学習アルゴリズムは、基本的に関数式の問題です。後で見てみましょう。

この記事はWeChatの公開アカウント「thunderbang」から転載したもので、以下のQRコードからフォローできます。この記事を転載する場合は、thunderbang公式アカウントまでご連絡ください。

<<:  UdeskブランドアップグレードWofeng TechnologyはAIコア技術を深化させ、5つの主要製品ラインでトップ1または2戦略を全面的に推進

>>:  快手テクノロジー副社長の王中元氏:ユーザーの90%はショートビデオに音楽を使用することを期待しています。快手は「AI+音楽」を使用してショートビデオの作成を支援します。

ブログ    

推薦する

複雑なクエリと集計操作の実装: MongoDB データベースでの Java の応用

MongoDB データベースに Java を適用すると、複雑なクエリや集計操作を実装できるため、開発...

エンティティと値オブジェクトの特性を識別する

[[411622]]正確さは集計の設計に直接影響するため、エンティティと値オブジェクトを区別すること...

アリババAIは1日1兆回以上呼び出され、中国を代表する人工知能企業に

アリババは9月26日、杭州で開催された雲奇大会で、初めて同社の人工知能通話の規模を発表した。1日あた...

ほとんどの企業はユーザーの同意を得ずに顔認識機能を使用している

顔認証機能の利用にあたり、利用者の同意を得ていない企業が半数近くあるというデータもある。ビッグデータ...

ハイブリッドクラウド環境でディープラーニングを取り入れたID認証はより柔軟

[51CTO.com からのオリジナル記事] 入れ墨は、秦と漢の時代に広く使用されていた刑法の一種で...

...

JVM チューニングの概要: 基本的なガベージ コレクション アルゴリズム

ガベージ コレクション アルゴリズムは、さまざまな観点から分類できます。基本的なリサイクル戦略によれ...

人工知能の台頭によりプログラマーは消滅するのでしょうか?

ローコードおよびノー​​コード プラットフォームの爆発的な成長により、個人でも組織でも、従来はコード...

「柯潔は2つの石を与えられた」が、それでもAIに負けた。プログラマーが知っておくべきトップ10のAIライブラリとフレームワークはこちら

[51CTO.comより引用] 遅かれ早かれ、この日はやって来る。イ・セドルがアルファ碁に1対4で負...

AIOps によるネットワーク管理の一般的な方法

エンタープライズ NetOps チームは、大量の受信データを精査して、ネットワーク上で発生する技術、...

ディープラーニング プラットフォームとして、TPU、GPU、CPU のどれが優れているでしょうか?誰かがベンチマーク調査を行った

GPU、TPU、CPU はすべてディープラーニング モデルのトレーニングに使用できますが、これらの各...

データサイエンティストが最もよく使用するアルゴリズム10選

最新の KDnuggets 調査では、データ サイエンティストの実際の業務で最もよく使用されるアルゴ...

これまで見たことのないアルゴリズムのダンス(ビデオ)

[[21488]]サピエンティア大学の以下のビデオをご覧ください。学生たちが中央ヨーロッパの民族舞...

...

機械学習を独学で学んだら、どうやって仕事を見つければいいのでしょうか?少なくともトップ10の地雷原は避ける

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...