10

私は、適切な決定を下すために、各パラメーターの正しい均等化が何であるかを見つけるのに役立つ機械学習ライブラリを実装する方法を模索しています。

さらに詳細に:

コンテキスト:htmlファイルの発行日エクストラクタを実装しようとしています。これはニュースサイト用なので、使用できる一般的な日付形式はありません。私はpythonのdateutilでパーサーを使用しています。これはかなり良い仕事をします。可能な公開日(htmlファイル内のすべての日付)のリストが表示されます。

クローズタグ、日付サブストリングに近い単語などの一連のパラメーターから。発行日である可能性に従ってリストをソートします。各パラメータの重み付けは、何らかの知識に基づいた推測です。

トレーニング期間(実際の公開日が提供される)の後に、各パラメーターの重み付けを決定する機械学習アルゴリズムを実装したいと思います。

Pythonのさまざまな機械学習ライブラリ(pyML、scikit-learn、pybrain)のドキュメントを読んでいますが、役立つものは何も見つかりませんでした。私もこれを読みました、そして、きのこが食べられるかどうかを決定することでの近い例があります。

注:私はPythonで作業しています。

よろしくお願いします。

4

2 に答える 2

11

問題の説明、yoruデータの特性、MLの背景と個人的な好みを考えると、Orangeをお勧めします。

Orangeは、成熟した無料のオープンソースプロジェクトであり、MLアルゴリズムの豊富な選択肢と、優れたドキュメントおよびトレーニング資料を備えています。ほとんどのユーザーはおそらくOrangeに付属のGUIを使用しますが、フレームワークはPythonでスクリプト化できます。

したがって、このフレームワークを使用すると、もちろん、さまざまな分類子をすばやく試すことができます。これは、(i)すべてが1か所にあるためです。(ii)それぞれが共通の構成構文GUIにアクセスされます。Orangeフレームワーク内のすべてのML手法は、Orangeインストールで提供される1つ以上のサンプルデータセットを「デモ」モードで実行できます。OrangeInstallで提供されるドキュメントは優れています。さらに、ホームページには、フレームワークに含まれるすべてのMLテクニックをカバーする多数のチュートリアルへのリンクが含まれています。

問題を考えると、おそらくディシジョンツリーアルゴリズム(C4.5またはID3の実装)から始めます。Dr. Dobbs Journal(オンライン)のかなり最近の版には、決定木の使用に関する優れた記事が含まれています。ユースケースは、(サーバーアクセスログからの)Webサーバーデータです。

OrangeにはC4.5の実装があり、GUIから(「ウィジェット」として)利用できます。それが簡単すぎる場合は、Pythonで1つをコーディングするのに必要なのは約100行だけです。これがその言語で機能する実装のソースです

いくつかの理由から、ディシジョンツリーから始めることをお勧めします。

  1. データに対して機能する場合は、トレーニングされた分類子だけでなく、分類スキーマ全体(バイナリツリーとして表される)の視覚的表現も得られます。デシジョンツリーは、この点でML手法の中で(おそらく)ユニークです。

  2. データの特性は、 C4.5の最適なパフォーマンスシナリオと一致しています。データは、カテゴリ変数または連続変数のいずれかになります(ただし、この手法は、データを説明しているように見える連続ではなく、離散的な機能(列/フィールド)が多い場合にパフォーマンスが向上します)。また、ディシジョンツリーアルゴリズムは、前処理なしで、不完全なデータポイントを受け入れることができます

  3. シンプルなデータ前処理。デシジョンツリーアルゴリズムに供給されるデータは、他のほとんどのML手法ほど多くのデータ前処理を必要としません。多くの場合、前処理は(通常は?)MLワークフロー全体で最も時間のかかるタスクです。また、文書化がまばらであるため、おそらくエラーの原因として最も可能性が高いものでもあります。

  4. ルートからの各ノードの距離から、つまり、訓練された分類器の迅速な視覚的検査から、各変数の(相対的な)重みを推定できます。訓練された分類器は単なる二分木であることを思い出してください(そしてしばしばレンダリングされますこのように)ノードは1つの機能(変数、またはデータセット内の列)の1つの値に対応します。もちろん、そのノードに結合された2つのエッジは、そのフィーチャの各ポイントの値に基づいて2つのグループに分割されたデータポイントを表します(たとえば、フィーチャがカテゴリ変数「HTMLページヘッドの公開日」の場合は、左エッジを通過します)。公開日が開始ヘッドタグと終了ヘッドタグ内にないすべてのデータポイントをフローし、右側のノードが他のグループを取得します)。これの意味は何ですか?ノードは特定の変数の状態または値を表すだけなので、データの分類におけるその変数の重要性(または重み)は、ツリー内の位置から推測できます。つまり、ルートノードに近いほど重要です。です。


質問から、トレーニングデータをML分類器にフィードする前に完了する必要があるタスクが2つあるようです。

I.もっともらしいクラスラベルを特定する

予測したいのは日付です。解決要件が非常に厳密でない限り(たとえば、単一の日付に解決される場合)、回帰モデル(単一の連続値を返す)ではなく、分類モデル(データポイントを指定してクラスラベルを返す)を構築します。

応答変数が日付である場合、簡単なアプローチは、最も早い日付をベースライン0に設定し、他のすべての日付をそのベースラインからの距離を表す整数値として表すことです。次に、すべての日付を少数の範囲に離散化します。これを行うための非常に簡単な手法の1つは、応答変数の5つの要約記述統計(最小、第1四分位、平均、第3四分位、および最大)を計算することです。これらの5つの統計から、賢明に選択された4つの日付範囲が得られます(ただし、スパンやメンバーシップのサイズは同じではない可能性があります)。

これらの4つの日付値の範囲は、クラスラベルを表します。たとえば、classIは、応答変数(公開日)が0から0〜10日後のすべてのデータポイント(Webページだと思います)である可能性があります。classIIは、0から11日後から0から25日後などです。

[注:この回答の下にあるOPのコメントに照らして、以下のコードを追加し、説明を求めました。]

# suppose these are publication dates
>>> pd0 = "04-09-2011"      
>>> pd1 = "17-05-2010"
# convert them to python datetime instances, e.g., 
>>> pd0 = datetime.strptime(pd0, "%d-%m-%Y")
# gather them in a python list and then call sort on that list:
>>> pd_all = [pd0, pd1, pd2, pd3, ...]
>>> pd_all.sort()
# 'sort' will perform an in-place sort on the list of datetime objects,
# such that the eariest date is at index 0, etc.
# now the first item in that list is of course the earliest publication date
>>> pd_all[0]
datetime.datetime(2010, 5, 17, 0, 0)
# express all dates except the earliest one as the absolute differenece in days
# from that earliest date
>>> td0 = pd_all[1] - pd_all[0]           # t0 is a timedelta object
>>> td0
datetime.timedelta(475)     
# convert the time deltas to integers:
>>> fnx = lambda v : int(str(v).split()[0])
>>> time_deltas = [td0,....]
# d is jsut a python list of integers representing number of days from a common baseline date
>>> d = map(fnx, time_deltas)    

II。生データを「MLで使用可能な」形式に変換します。

C4.5分類器の場合、このタスクははるかに単純であり、おそらく他のすべてのMLアルゴリズムよりも必要なステップが少なくなります。ここで推奨されるのは、比較的少数の値、可能な限り多くのパラメーターに離散化することです。たとえば、パラメーター/変数の1つが「公開日付文字列から終了本文タグまでの距離」である場合、私はマーケティング調査では、参加者に単一の整数ではなく、指定されたスパンのセット(18〜35、36〜50など)のいずれかで年齢を報告するように求められることが多いため、これらの値を範囲に離散化することをお勧めします(41)。

于 2011-07-05T20:39:05.557 に答える
2

機械学習が必要であると仮定すると(ドキュメントセットが十分に大きい、ニュースサイトの数が十分に多いため、サイトごとにパーサーを作成するのは扱いにくい、URLに明確な発行日マーカーが含まれていない、HTTP Last-Modifiedヘッダーは信頼できない、など)-次のようなアプローチを検討できます。

  • 決定木、ベイジアン学習、またはその他の機能を使用して、テキストの特徴を「この日付が指定された発行日である確率はどうなると思いますか...」という種類の特徴に変換します。
  • maxent学習を使用して重みを計算します(たとえば、http ://www-i6.informatik.rwth-aachen.de/web/Software/YASMET.htmlが役立ちます)。
于 2011-07-05T21:26:36.577 に答える