全て

kaggle1位の解析手法 「メルカリにおける値段推定」(3) 1位の手法

< kaggle1位の解析手法 「メルカリにおける値段推定」2.可視化 前回は過去kaggleコンペでメルカリが「メルカリにおける値段推定」(Mercari Price Suggestion Challenge)のデータ可視化を解説します。今回は1位の手法を解説したいと思います。   (3) 1位の解法 ___3.1 1位の解法の概要 ___3.2 1位の解法の特徴 ___3.3 1位の解法のコード (3) 1位の解法 Paweł and Konstantinのチームが終了後解法を公開しました。1位解法は非常にシンプルなNNで構成されており、多様性の出し方やモデリング方法など必見です。 いろいろ試行錯誤した結果から、最終的な解法は12個のMLPのアンサンブルになりました。最終的なモデルは同じデータで異なるモデルを学習させるよりも、異なるデータを同じモデルに学習させたほうが多様性を表現できることに気づき、モデルはMLPと決めたそうです。計算時間制約を考えてもMLPは都合が良かったとのこと。 1位解法の特徴 ・MLPは2種類に大別できます。一つは損失をHuber lossとした回帰モデルで、もう一つが分類モデルを経由した回帰モデルです。分類モデルは、過剰適合が少ないため、それ自体でより良いスコアができました。 ・学習/推論の直前で特徴量を全て2値化(非ゼロか否か)する処理を加えてると、スコア改善は見られなかったようです。 ・1層目にL2正則化を加えることは効果的だったようです。RELUよりもPRELUが効果的だったそうです。 ・最終的に選択した2つのsubmitはtensorflowとMXNetそれぞれで実装したモデルにしたそうです。MXNetモデルは高速でしたが、より多くのメモリを使用し、信頼性が低くになります。 1位解法のコード import os; os.environ[‘OMP_NUM_THREADS’] = ‘1’ from contextlib import contextmanager from functools import partial from operator import itemgetter from multiprocessing.pool import ThreadPool import time from typing import List, …

kaggle1位の解析手法 「メルカリにおける値段推定」(3) 1位の手法 Read More »

kaggle1位の解析手法 「メルカリにおける値段推定」2.可視化

< kaggle1位の解析手法 「メルカリにおける値段推定」1.データ概要 > kaggle1位の解析手法 「メルカリにおける値段推定」3. 1位の手法 前回は過去kaggleコンペでメルカリが「メルカリにおける値段推定」(Mercari Price Suggestion Challenge)のデータ概要を解説します。今回はデータ可視化を解説したいと思います。 2. Kaggleメルカリのデータ ___2.1 データの概要 ___2.2 データ可視化 ___2.3 データの前処理 2. Kaggleメルカリのデータ データは2stageになります。2stageコンペでは、配布されたテストデータの全量がpublic LB用の評価データ(stage 1)、競技者には非公開のテストデータがprivate LB用の評価データ(stage 2)となります。 では、データを確認しましょう。 train = pd.read_csv(f'{PATH}train.tsv’, sep=’\t’) test = pd.read_csv(f'{PATH}test.tsv’, sep=’\t’) print(train.shape) print(test.shape) (1482535, 8) (693359, 7) train.head() 目的変数: Price train.price.describe() count 1.482535e+06 mean 2.673752e+01 std 3.858607e+01 min 0.000000e+00 25% 1.000000e+01 50% 1.700000e+01 75% 2.900000e+01 …

kaggle1位の解析手法 「メルカリにおける値段推定」2.可視化 Read More »

kaggle1位の解析手法 「メルカリにおける値段推定」1.データ概要

過去kaggleコンペでメルカリが「メルカリにおける値段推定」(Mercari Price Suggestion Challenge)を開催されました。今回の記事はkaggle1位の解析手法をまとめたいと思います。データ概要、可視化、1位の手法の3つの記事を分けています。今回はデータ概要を解説します。 目次 1. Kaggleメルカリコンペの概要 ___1.1 コンペの概要 ___1.2 コンペの目的 ___1.3 コンペのルール   1. Kaggleメルカリコンペの概要 1.1 コンペの概要 Kaggleでメルカリコンペは株式会社メルカリが主催した、商品の適正な販売価格予測コンペです。訓練データとして、ユーザーが投稿した商品情報、商品の状態、ブランド名などデータによって、販売価格を予測するモデル作成が課題です。テーブルデータですが文章データも含まれているためNLPの知識が必要になります。kernel only コンペなので実験環境と実行時間に制限があります。   1.2 コンペの目的 目的:フリマアプリ「メルカリ」は、誰でも簡単に売買ができるフリマアプリで、出品時に売り手が商品の価格設定をする必要があります。価格を相場以上にすると売れませんし、相場以下にすると損をしてしまいます。適正な販売価格と設定のために、相場を調べておけば解決できますが、手間がかかります。そのため、販売者が投稿した情報を基に「適正な販売価格」を予測するシステムを目的とします。   1.3 コンペのルール 賞金: 1位60,000米ドル、2位30,000米ドル、3位10,000米ドル 期間: 2017/11/22 ~ 2018/02/22 参加チーム数:2,382 環境:kernel only kernelの環境は 4cores / 16GB RAM / 1GB disk / GPUなし で計算時間を60分未満です。 評価:RMLSE Root Mean Squared Logarithmic Error 定義は RMLSEスコアが低ければ低いほど、小さい誤差で値段を推定できます。 詳細:https://www.kaggle.com/c/mercari-price-suggestion-challenge/overview > kaggle1位の解析手法 「メルカリにおける値段推定」2.可視化

LightGBMの解説

関連記事: 決定木分析、ランダムフォレスト、Xgboost、CatBoost 「勾配ブースティング」の開発は順調に進んでいます。 勾配ブースティングは、Kaggleで上位ランキングを取った半数以上もの勝者が勾配ブースティングを利用しました。 この記事では、Microsoft開発の「勾配ブースティング」のlightGBMを解説します。 目次 1. LightGBMとは 2. LightGBMの特徴 3. LightGBMのパラメーター 4. 実験・コード __4.1 データ読み込み __4.2 xgb __4.3 lightgb __4.4 モデル評価 1. LightGBMとは LightGBM(読み:ライト・ジービーエム)決定木アルゴリズムに基づいた勾配ブースティング(Gradient Boosting)の機械学習フレームワークです。LightGBMは米マイクロソフト社2016年にリリースされました。前述した通り勾配ブースティングは複数の弱学習器(LightGBMの場合は決定木)を一つにまとめるアンサンブル学習の「ブースティング」を用いた手法です。 LightGBMは大規模なデータセットに対して計算コストを極力抑える工夫が施されています。この工夫により、多くのケースで他の機械学習手法と比較しても短時間でモデル訓練が行えます。 LightGBMはこの「Leaf-wise」という手法を採用しています。従来の「Level-wise」に比べてLightGBMが採用している「Leaf-wise」は訓練時間が短くなる傾向にあります。 2. LightGBMの特徴 モデル訓練に掛かる時間が短い メモリ効率が高い Leaf-Wiseのため推測精度が高い。 LightGBMは大規模データに適している手法 3. LightGBMのパラメーター ・booster [default=gbtree] モデルのタイプを選択: gbtree: ツリーベースのモデル gblinear: 線形モデル ・silent [default=0]: メッセージのモード:1=メッセージを表示しない  0 = メッセージを表示する ・nthread [デフォルトで利用可能なスレッドの最大数] スレッド数の設定 ・eta [default=0.3 GBMのlearning rate 各ステップの重みを縮小することにより、モデルをより堅牢にする …

LightGBMの解説 Read More »

ホールドアウト検証と交差検証

機械学習における「validation」は、一般的に「モデルの汎化性能の検証」を意味します。汎化性能とは「未知のデータに対する性能」のことです。今回はホールドアウト検証 (Hold-out Validation)と交差検証(Cross Validation)を解説します。 目次 1. ホールドアウト検証 (Hold-out Validation) 2. 交差検証 (Cross Validation) 3, train_test_split クラスAPI 4. cross_val_scoreクラスAPI 5. 実験・コード __5.1 ホールドアウト検証 __5.2 交差検証   1. ホールドアウト検証 (Hold-out Validation) ホールドアウト法は、モデルを作る学習データ (Train Data)と、モデルを評価するテストデータ(Test Data)に分割して評価します。モデルは未知のデータを予測しなければならないからです。学習データでテストしても、モデルの汎化能力は評価できません。下記のようなデータセットでスコアを計算します。   2. 交差検証 (Cross Validation) 交差検定では、用意したデータをK個に分割して、1回目はそのうちの一つをテストデータ、それ以外を学習データとして、学習・評価します。2回目は1回目と異なる別のデータをテストデータとして使い、3回目は1,2回目と異なるデータで評価をします。そして、各回で測定した精度の平均を取ります。下記のようなデータセットで平均スコアを計算します。 ホールドアウト検証の例よりも、更に汎用的に性能を確認できます。しかし、訓練とテストを K 回行うため、計算時間がかかります。 3, train_test_split クラスAPI sklearn.model_selection.train_test_split(*arrays, **options) 引数 – X_train: 学習用の特徴行列 – X_test: テスト用の特徴行列 – …

ホールドアウト検証と交差検証 Read More »

モデルの評価モジュールのsklearn.metrics

scikit-learnには、作成したモデルの評価を行うモジュールとしてsklearn.metricsが搭載されています。 今回はsklearn.metricsをまとめた話をしていきます。 https://scikit-learn.org/stable/modules/classes.html 目次 1. sklearn.metricsモジュール 2. モデル選択インターフェース 3. 分類のメトリック 4. 回帰のメトリック 5. マルチラベルランキングのメトリック 6. クラスタリングのメトリック 7. バイクラスタリングのメトリック 8. ペアワイズのメトリック   1. sklearn.metricsモジュール sklearn.metricsモジュールには、スコア関数、パフォーマンスメトリック、ペアワイズメトリック、および距離計算が含まれます。 2. モデル選択インターフェース metrics.check_scoring(estimator [、scoring、…])ユーザーオプションからスコアラーを決定します。 metrics.get_scorer(スコアリング)文字列からスコアラーを取得します。 metrics.make_scorer(score_func [、…])パフォーマンスメトリックまたは損失関数からスコアラーを作成します。 3. 分類のメトリック クラス分類 (Classification) を行った際の識別結果 (予測結果) の精度を評価するモジュールを実装します。 metrics.accuracy_score(y_true、y_pred [、…])精度分類スコアです。 metrics.auc(x、y [、reorder])trapezoidal ruleを使用したArea Under the Curve(AUC)。 metrics.average_precision_score(y_true、y_score)予測スコアから平均精度(AP) metrics.balanced_accuracy_score(y_true、y_pred)バランスの精度 metrics.brier_score_loss(y_true、y_prob [、…])ブライアースコア metrics.classification_report(y_true、y_pred)主な分類指標を示すテキストレポートを作成します。 metrics.cohen_kappa_score(y1、y2 [、labels、…])Cohen’s kappa:アノテーター間の合意を測定する統計指標です。 metrics.confusion_matrix(y_true、y_pred …

モデルの評価モジュールのsklearn.metrics Read More »

ランク学習の解説

今回の記事はPythonのsklearnでランク学習を解説します。 目次 1. ランク学習とは 2. ランク学習のアプローチ 1. ランク学習とは ランク学習は英語では ”Learning to rank” といってLTRの略称、または ”Machine-learned rankingといってMLRとよく省略されます。ランク学習は一般に教師あり、半教師あり、または強化学習を用いてランキング問題を解く方法です。たとえば、どこかの検索エンジンでキーワードを入力して、これらのウェブページをどういう順番で表示するのが良いのかを学習するのがランク学習になります。ランク学習を利用することで、検索エンジンではユーザーに見られる確率が高いページを上位に表示したり、ショッピングサイトではおすすめの商品を提示することができるようになります。 ランク学習機械学習と別の機械学習の違い – LTRの入力データはアイテムのリストです。LTRの目的は、これらのアイテムの最適な順序を見つけることです。 – LTRのアイテムが正確なスコアより、アイテム間の相対的な順序のほうが大切です。 2. ランク学習のアプローチ ポイントワイズアプローチ(Pointwise Approach) ポイントワイズアプローチの入力データには、各単一ドキュメントの特徴ベクトルが含まれています。 出力スペースには、個々のドキュメントの関連度が含まれます。 関連度の観点から、さまざまな種類の判断をグラウンドトゥルースラベルに変換できます。 ペアワイズアプローチ(Pairwise Approach) ペアワイズアプローチの入力データには、特徴ベクトルで表されるドキュメントのペアが含まれています。 出力スペースには、ドキュメントの各ペア間のペアワイズ設定({+ 1、-1}から値を取得)が含まれます。 さまざまな種類の判断は、ペアワイズ設定の観点からグラウンドトゥルースラベルに変換できます。 リストワイズアプローチ(Listwise Approach) リストワイズアプローチの入力データには、クエリに関連付けられたドキュメントのセットが含まれます。リスト方式の出力スペースには、ドキュメントのランク付けされたリスト(または順列)が含まれます。 ランク付けされたリストの観点から、さまざまな種類の判断をグラウンドトゥルースラベルに変換できます。 論文:”Learning to Rank for Information Retrieval”、Tie-Yan Liu of Microsoft Research Asia https://www.cda.cn/uploadfile/image/20151220/20151220115436_46293.pdf

PythonのJoblibで並列処理

前回の記事はPysparkの分散処理でビックデータ処理の時間を大きく短縮させる方法を解説しました。今回は複数のCPUコアで並列処理の高速に計算の方法を解説します。 目次 1. joblibの概要 __1.1 分散処理 並列処理の違い __1.2  joblib.Parallelの解説 2. 実験・コード __2.1 ライブラリーのインストール __2.2  環境情報を表示 __2.3. 普通のPythonの処理 __2.4.  Joblibの並列処理 __2.5. 結果比較(可視化) 3. まとめ 1. joblibの概要 1.1分散処理 並列処理の違い 並列(Parallel⁠):複数の計算機や複数の計算ユニットで構成される1つの自律的な処理です。1つの自律的なシステムであるため,当該処理系を構成する複数の計算機は,常に同一の状態を維持している必要があります。並列とは、計算速度を向上させるために同時に行うという物理的な概念です。 分散(Distributed⁠):複数の自律的なシステムをネットワークとおして連携する処理です。分散システム技術をレプリケーションと呼びます。クラスター構成を構築して、やるようなSpark等がこれに当てはまります。 この2つは、そもそも目的が違う概念です。並行というのは、世の中一般、同時進行するものごとをプログラムとして表現する際に用いる広い概念です。一方で並列というのは、主に計算速度を稼ぐために計算を同時に進めることを言います。 1.2 joblib.Parallelの解説 joblib.Parallel(n_jobs=None, backend=None, verbose=0, timeout=None, pre_dispatch=’2 * n_jobs’, batch_size=’auto’, temp_folder=None, max_nbytes=’1M’, mmap_mode=’r’, prefer=None, require=None) n_jobsはタスクを何分割するかという指定をする部分です。-1でコア数をマックスで使うように計らってくれます。 verboseは途中経過を表示する頻度を指定する引数で0~10の値です。0ではなにも表示せず、10で最頻になります。 backendで”threading”を選べばマルチスレッドで動作して、オーバーヘッドは減るがPythonのGILにより通常の処理中は並列処理できない(GILをリリースする部分だけが並列で動作できる=DBアクセスの待ちなどが大きいプログラムの場合のみ有効で小さい場合は速度低下の恐れもある)、デフォルトは”multiprocessing”のマルチプロセス動作です。 Timeout 完了する各タスクのタイムアウト制限です。タスクに時間がかかると、TimeOutErrorが発生します。 pre_dispatch 事前発送されるタスクのバッチの数。 batch_size 各ワーカーに一度にディスパッチする自動的のタスクの数。 temp_folder ワーカープロセスとメモリを共有するために大きな配列をマッピングするためにプールで使用されるフォルダーです。 …

PythonのJoblibで並列処理 Read More »

PySparkでのk-meanクラスタリング

関係記事:クラスター数の決め方の1つシルエット分析、 k-means++ ビッグデータ処理や機械学習の場合は、巨大データの取り扱いを目的とした分散処理のフレームワークが必要です。特定のアプリケーションに関する実行性能はSpark MLです。今回の記事はSpark MLでk-meanのクラスタリングを解説します。 目次 1. PySparkのクラスタリング 2. 実験・コード __2.1 ライブラリーのインポート __2.2 データ処理 __2.3. シルエットスコアの比較 __2.4. クラスタリングのモデルを作成 __2.5. 可視化 1. Spark MLのk-meanクラスタリング Spark MLはSparkの統計処理、機械学習を分散処理するライブラリです。k-meanはは最も一般的に使われる、事前に定義したクラスタ数までデータを群にする、クラスタリング アルゴリズムです。 spark.mlでのパラメータ: – k は要求するクラスタの数です。 – maxIterations は実行の繰り返しの最大数です。 – initializationMode はランダム初期化 – initializationSteps は k-meansアルゴリズム内でのステップ数を決定します。 – epsilon はk-meansが収束したと見なす距離の閾値を決定します。 – initialModel は初期化に使用されるクラスタの中心点の任意のセットです。 2. 実験・コード 概要 データセット: UCI機械学習リポジトリの白ワインの属性 環境: Databricks Runtime Version: 6.0 ML (includes …

PySparkでのk-meanクラスタリング Read More »

ハフ変換とLSDによる直線検出の比較

関連記事: 画像解析 前回の記事は「OpenCV + Pythonでの直線検出」を解説しました。今回はPythonでハフ変換(Hough)とLSDによる直線検出を比較します。 目次 1. ハフ変換(Hough Transform) 2. LSD (Line Segment Detector) 3. ハフとLSDの比較 4. 実験・コード __4.1 データロード __4.2 ライブラリのインストール __4.3. 直線検出 __4.4. 結果比較 1. ハフ変換とは ハフ変換 (Hough変換) は、画像処理で画像の特徴抽出法の一つです。現在広く用いられている変換法はRichard Duda及びPeter Hartが1972年に発明しました。ハフ変換の基本原理は点を通る直線は無限個存在し、それぞれが様々な方向を向きます。ハフ変換の目的は、それらの直線の中で、画像の「特徴点」を最も多く通るものを決定します。 直線の式は次のようになる: ハフ変換では画像空間からρ-θパラメータ空間への変換を行います。ある画像空間上に孤立点があり、点の座標が(x, y)である場合、パラメータ空間への変換を行うとどのような結果が得られるのか、考えることにします。 ρ : 座標(x, y)を通る直線に対し、原点から垂線を下ろしたときの長さ θ : 座標(x, y)を通る直線に対し、原点から垂線を下ろしたときにx軸となす角度 論文:Use of the Hough Transformation To. Detect Lines and Curves in Pictures …

ハフ変換とLSDによる直線検出の比較 Read More »