0

私は、ほぼすべての反復で前処理が変化する一連の実験を実行しています。データをフォーマットしたら、scikits (liblinear) から分類器を実行する必要があります。データを svm light 形式で取得できます。それをscikits標準に変換するモジュールがあることを理解しています。問題は、ファイルをディスクに書きたくないということです。私は 48 ギガのメモリを持っているので、むしろメモリ内で変換したいと思っています。

以下は、svm light フォーマットを使用して、stringio オブジェクトに ito を書き込み、その上に svm light loader を sic する例です。残念ながら、ローダーはサイディングを拒否します (別の方法で動作します)。助言がありますか?1000 以上の異なる前処理パイプラインを実行していますが、ディスクへの書き込みを続けることができません。

サンプルの svm light データは次の場所にあります: http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/a1a

私のコード

 import numpy as np
 from sklearn.datasets import svmlight_format

 import cStringIO

 bufFile = cStringIO.StringIO()
 with open('C:/Users/theDesktop/Desktop/sampleData.txt') as a:
        p = a.readlines()
        a.close()

 bufFile.writelines(p)

 X_train, y_train = svmlight_format.load_svmlight_file(bufFile)

私のエラー:

Traceback (most recent call last):

File "C:\Users\theDesktop\Desktop\module1.py", 
line 25, in <module> X_train, y_train=svmlight_format.load_svmlight_file(bufFile)

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 97, in load_svmlight_file zero_based))

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 177, in load_svmlight_files for _, indices, _, _ in r):

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 177, in <genexpr> for _, indices, _, _ in r):

File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", 
line 1895, in amin return amin(axis, out)

ValueError: zero-size array to minimum.reduce without identity
4

1 に答える 1

1

もう一度見てみると、以下の別の質問に答えたと思います (興味がある場合は確認してください) =) メモリ効率の良いフォーマット コンバーターと新しい視点を探しています。まず第一に、48ギガのメモリを持つことの問題点は何ですか? 何百万ものドキュメントを含むコーパスで作業していない限り、テキスト処理には十分です。第二に、sklearn がファイルを異なるインスタンスの異なるファイルとしてディスクに書き込んでいる場合、上書きするように調整でき、最終的に最後の反復を削除できます。または、osターミナルを接続するために使用でき、そこからrmコマンドを使用して、各反復で、または一度にすべてのファイルを削除できます。

問題が各反復で新しいオブジェクトを作成するpythonである場合、上書きはメモリ効率の解決策です。

私はあなたを助けようとしています。私が見当違いまたは誤解している場合は、これを読んでいる他の人が混乱しないようにコメントしてください。


表には少し遅れていますが、私が理解している限りでは、python と svm-light の間のインターフェースとして sklearn を使用しています。あなたが望む出力はわかりません。しかし、それがさまざまな前処理方法の正確さの尺度である場合はos、コマンドライン間のインターフェイスとして python のライブラリを使用し、インストール後にそこから svm-light を呼び出すことができます。次に、grepまたは同様のツールを使用して、svm-light の学習および分類スクリプトがログ情報を std 出力に出力するため、精度またはその他の必要な情報を抽出できます。また、トレーニングと分類の後に svm-light がモデル ファイルとその他のファイルを出力することにも注意してください。したがって、rm反復ごとにまたはその他のツールを使用してそれらを削除するか、何度も何度も上書きして最後に削除する必要があります。

このようにして、あなたが言ったようにメモリを節約でき、おそらく(?) sklearnを使用するよりも多くの情報に到達できます. 最後に、この回避策の複雑さについてはよくわかりません。時間がかかる可能性があります。時間が制約されているかどうかを確認してください。

これが可能で効率的な回避策であるかどうかはわかりませんが、3 か月が経過したため、この状況をすでに克服していると確信しています。しかし、コメントをすると、他の人の助けになるかもしれません。

于 2013-03-19T08:19:38.170 に答える