-2

ランダムフォレストクラシファイアを実行し、クロスバリデーションを使用してモデルを評価しようとしています。私はpySparkで働いています。入力CSVファイルはSpark DataFrame形式として読み込まれます。 しかし、私はモデルを構築する際に問題に直面しています。pyspark.sql.utils.IllegalArgumentException:u'Field "features"が存在しません。

以下はコードです。

from pyspark import SparkContext 
from pyspark.sql import SQLContext 
from pyspark.ml import Pipeline 
from pyspark.ml.classification import RandomForestClassifier 
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder 
from pyspark.ml.evaluation import MulticlassClassificationEvaluator 
from pyspark.mllib.evaluation import BinaryClassificationMetrics 
sc = SparkContext() 
sqlContext = SQLContext(sc) 
trainingData =(sqlContext.read 
     .format("com.databricks.spark.csv") 
     .option("header", "true") 
     .option("inferSchema", "true") 
     .load("/PATH/CSVFile")) 
numFolds = 10 
rf = RandomForestClassifier(numTrees=100, maxDepth=5, maxBins=5, labelCol="V5409",featuresCol="features",seed=42) 
evaluator = MulticlassClassificationEvaluator().setLabelCol("V5409").setPredictionCol("prediction").setMetricName("accuracy") 
paramGrid = ParamGridBuilder().build() 

pipeline = Pipeline(stages=[rf]) 
paramGrid=ParamGridBuilder().build() 
crossval = CrossValidator(
    estimator=pipeline, 
    estimatorParamMaps=paramGrid, 
    evaluator=evaluator, 
    numFolds=numFolds) 
model = crossval.fit(trainingData) 
print accuracy 

私はエラー

Traceback (most recent call last): 
    File "SparkDF.py", line 41, in <module> 
    model = crossval.fit(trainingData) 
    File "/usr/local/spark-2.1.1/python/pyspark/ml/base.py", line 64, in fit 
    return self._fit(dataset) 
    File "/usr/local/spark-2.1.1/python/pyspark/ml/tuning.py", line 236, in _fit 
    model = est.fit(train, epm[j]) 
    File "/usr/local/spark-2.1.1/python/pyspark/ml/base.py", line 64, in fit 
    return self._fit(dataset) 
    File "/usr/local/spark-2.1.1/python/pyspark/ml/pipeline.py", line 108, in _fit 
    model = stage.fit(dataset) 
    File "/usr/local/spark-2.1.1/python/pyspark/ml/base.py", line 64, in fit 
    return self._fit(dataset) 
    File "/usr/local/spark-2.1.1/python/pyspark/ml/wrapper.py", line 236, in _fit 
    java_model = self._fit_java(dataset) 
    File "/usr/local/spark-2.1.1/python/pyspark/ml/wrapper.py", line 233, in _fit_java 
    return self._java_obj.fit(dataset._jdf) 
    File "/home/hadoopuser/anaconda2/lib/python2.7/site-packages/py4j/java_gateway.py", line 1160, in __call__ 
    answer, self.gateway_client, self.target_id, self.name) 
    File "/usr/local/spark-2.1.1/python/pyspark/sql/utils.py", line 79, in deco 
    raise IllegalArgumentException(s.split(': ', 1)[1], stackTrace) 
pyspark.sql.utils.IllegalArgumentException: u'Field "features" does not exist.' 
[email protected]:~/workspace/RandomForest_CV$ 

の下に取得していますpySparkでこの問題を解決するために私を助けてください。 ありがとうございます。

ここでは、データセットの詳細を示します。 いいえフィーチャーの列は特にありません。以下は、最初の5行のデータセットを表示するtrainingData.take(5)の出力です。 (V4366 = 0.0、V4460 = 0.232、V4916 = -0.017、V1495 = -0.104、V1639 = 0.005、V1967 = -0.008、V3049 = 0.177、V3746 = -0.675、V3869 = -3.451、V524 = 0.004、V5409 = 0)、行(V4366 = 0.0、V4460 = 0.111、V4916 = -0.003、V1495 = -0.137、V1639 = 0.001、V1967 = -0.01、V3049 = 0.01、V3746 = -0.867、V3869 = -2.759、 V524 = 0.0、V5409 = 0)、行(V4366 = 0.0、V4460 = -0.391、V4916 = -0.003、V1495 = -0.155、V1639 = -0.006、V1967 = -0.019、V3049 = -0.706、V3746 = 0.166、V3869 = 0.189、V524 = 0.001、V5409 = 0)、Row(V4366 = 0.0、V4460 = 0.098、V4916 = -0.012、V1495 = -0.108、V1639 = 0.005、V1967 = -0.002、V3049 = 0.033、V3746 = -0.787、 V3869 = -0.926、V524 = 0.002、V5409 = 0)、行(V4366 = 0.0、V4460 = 0.026、V4916 = -0.004、V1495 = -0.139、V1639 = 0.003、V1967 = -0.006、V3049 = -0.045、V3746 = V524のV433は偉業である-0.208、V3869 = -0.782、V524 = 0.001、V5409 = 0)]

ures。 V5409はクラス・ラベルです。

+3

'trainingData.show()'の出力を持つdata-plsアップデートポストが必要です。 csvファイルに 'features'という名前の列がありますか? – desertnaut

+0

機能列がありません。私はデータに属性名を持っています。 –

+0

私は自分の質問を更新しました。ありがとうございました –

答えて

0

スパークMLではSparkのデータフレームが使用されていません。すべての機能は、の単一の列のベクトルである必要があります。通常はfeaturesとなります。 (私はあなたのために、確かにあなたは、マルチクラス分類を持っていると仮定していますあなたのパイプラインが正常に動作する必要があり、その後

spark.version 
# u'2.2.0' 

from pyspark.sql import Row 
from pyspark.ml.linalg import Vectors 

# your sample data: 
temp_df = spark.createDataFrame([Row(V4366=0.0, V4460=0.232, V4916=-0.017, V1495=-0.104, V1639=0.005, V1967=-0.008, V3049=0.177, V3746=-0.675, V3869=-3.451, V524=0.004, V5409=0), Row(V4366=0.0, V4460=0.111, V4916=-0.003, V1495=-0.137, V1639=0.001, V1967=-0.01, V3049=0.01, V3746=-0.867, V3869=-2.759, V524=0.0, V5409=0), Row(V4366=0.0, V4460=-0.391, V4916=-0.003, V1495=-0.155, V1639=-0.006, V1967=-0.019, V3049=-0.706, V3746=0.166, V3869=0.189, V524=0.001, V5409=0), Row(V4366=0.0, V4460=0.098, V4916=-0.012, V1495=-0.108, V1639=0.005, V1967=-0.002, V3049=0.033, V3746=-0.787, V3869=-0.926, V524=0.002, V5409=0), Row(V4366=0.0, V4460=0.026, V4916=-0.004, V1495=-0.139, V1639=0.003, V1967=-0.006, V3049=-0.045, V3746=-0.208, V3869=-0.782, V524=0.001, V5409=0)]) 

trainingData=temp_df.rdd.map(lambda x:(Vectors.dense(x[0:-1]), x[-1])).toDF(["features", "label"]) 
trainingData.show() 
# +--------------------+-----+ 
# |   features|label| 
# +--------------------+-----+ 
# |[-0.104,0.005,-0....| 0| 
# |[-0.137,0.001,-0....| 0| 
# |[-0.155,-0.006,-0...| 0| 
# |[-0.108,0.005,-0....| 0| 
# |[-0.139,0.003,-0....| 0| 
# +--------------------+-----+ 

:ここであなたは一例として提供した5行を使用してそれを行うことができる方法でありますサンプルは以下のように、あなたの​​とevaluatorにラベル列を変更することで、ラベルとしてのみ0)が含まれています

rf = RandomForestClassifier(numTrees=100, maxDepth=5, maxBins=5, labelCol="label",featuresCol="features",seed=42) 
evaluator = MulticlassClassificationEvaluator().setLabelCol("label").setPredictionCol("prediction").setMetricName("accuracy") 

最後に、print accuracyは動作しません - あなたの代わりにmodel.avgMetricsが必要になります。

+0

上記のようにspark.createDataFrame()を渡すと、NameErrorが表示されています:name 'spark'が定義されていません。これを解決するには?この答えをありがとう。それは非常に便利でした。 –

+0

@LokeswariVenkataramanaおそらくあなたはSpark(1.x)の古いバージョンを使用しています。このコマンドは必要ありません。あなたのコードで行うように、最初のcsvファイルを 'temp_df'という名前のデータフレームで読み込んだ後、' trainingData'を定義します。 – desertnaut

+1

以下の行を追加しましたNameError:name Sparkが定義されていません。からpyspark.context import SparkContext pyspark.sqlから。セッションのインポートSparkSession SC = SparkContext( 'ローカル') 火花= SparkSession(SC) –

関連する問題