выдавать в кодировке нечисловой функции числовое значение в Spark и Ipython

Я работаю над чем-то, где мне приходится делать прогнозы для numeric данных (ежемесячные расходы сотрудников) с использованием non-numeric функций. Я использую Spark MLlibs Random Forests algorthim . У меня features данные моих features в dataframe который выглядит так:

  _1 _2 _3 _4 0 Level1 Male New York New York 1 Level1 Male San Fransisco California 2 Level2 Male New York New York 3 Level1 Male Columbus Ohio 4 Level3 Male New York New York 5 Level4 Male Columbus Ohio 6 Level5 Female Stamford Connecticut 7 Level1 Female San Fransisco California 8 Level3 Male Stamford Connecticut 9 Level6 Female Columbus Ohio 

Здесь столбцы – employee level , gender , city , state и это мои features с помощью которых я хочу делать прогнозы ежемесячных расходов сотрудника (метка в $).

Набор учебных ярлыков выглядит следующим образом:

 3528 4958 4958 1652 4958 6528 4958 4958 5528 7000 

Поскольку features находятся в non-numeric форме, поэтому мне нужно encode их на numeric . Поэтому я следую этой ссылке для кодирования categorical data в numbers . Я написал этот код для этого (следуя процессу, упомянутому в связанной статье):

 import numpy as np from sklearn.feature_extraction import DictVectorizer as DV import pandas as pd def extract(line): return (line[1],line[2],line[3],line[7],line[9],line[10],line[22]) inputfile = sc.textFile('file1.csv').zipWithIndex().filter(lambda (line,rownum): rownum>0).map(lambda (line, rownum): line) input_data = (inputfile .map(lambda line: line.split(",")) .filter(lambda line: len(line) >1 ) .map(extract)) # Map to tuples (train_data, test_data) = input_data.randomSplit([0.8, 0.2]) # converting RDD to dataframe train_dataframe = train_data.toDF() # converting to pandas dataframe train_pandas = train_dataframe.toPandas() # filtering features train_pandas_features = train_pandas.iloc[:,:6] # filtering label train_pandas_label = train_pandas.iloc[:,6] train_pandas_features_dict = train_pandas_features.T.to_dict().values() # encoding features to numeric vectorizer = DV( sparse = False ) vec_train = vectorizer.fit_transform( train_pandas_features_dict ) 

Когда я print vec_train все, что я вижу, равно 0. во всех столбцах функций. Что-то вроде этого:

 [[ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] ..., [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.]] 

Я думаю, что где-то я делаю ошибку, из-за которой эта encoding не дает правильного результата. Какую ошибку я делаю? И есть ли другой лучший способ encode non-numeric features в numeric для случая, который я описал в верхней части (предсказание числовых ежемесячных расходов на основе нечисловых данных сотрудников)?

One Solution collect form web for “выдавать в кодировке нечисловой функции числовое значение в Spark и Ipython”

Вообще говоря, если у вас есть данные, которые можно обрабатывать с использованием фреймов данных Pandas и scikit-learn с использованием Spark, похоже, серьезный перебор. Тем не менее, если вы это делаете, вероятно, имеет смысл использовать инструменты Spark полностью. Давайте начнем с индексирования ваших функций:

 from pyspark.ml.feature import StringIndexer from pyspark.ml.pipeline import Pipeline from pyspark.ml.feature import VectorAssembler label_col = "x3" # For example # I assume this comes from your previous question df = (rdd.map(lambda row: [row[i] for i in columns_num]) .toDF(("x0", "x1", "x2", "x3"))) # Indexers encode strings with doubles string_indexers = [ StringIndexer(inputCol=x, outputCol="idx_{0}".format(x)) # For classifications problems # - if you want to use ML you should index label as well # - if you want to use MLlib it is not necessary # For regression problems you should omit label in the indexing # as shown below for x in df.columns if x not in {label_col} # Exclude other columns if needed ] # Assembles multiple columns into a single vector assembler = VectorAssembler( inputCols=["idx_{0}".format(x) for x in df.columns if x != label_col], outputCol="features" ) pipeline = Pipeline(stages=string_indexers + [assembler]) model = pipeline.fit(df) indexed = model.transform(df) 

Конвейер, определенный выше, создаст следующий фрейм данных:

 indexed.printSchema() ## root ## |-- x0: string (nullable = true) ## |-- x1: string (nullable = true) ## |-- x2: string (nullable = true) ## |-- x3: string (nullable = true) ## |-- idx_x0: double (nullable = true) ## |-- idx_x1: double (nullable = true) ## |-- idx_x2: double (nullable = true) ## |-- features: vector (nullable = true) 

где features должны быть допустимым входом для mllib.tree.DecisionTree (см. SPARK: Как создать категориальнуюFeaturesInfo для деревьев решений из LabeledPoint? ).

Вы можете создавать метки из этого списка следующим образом:

 from pyspark.mllib.regression import LabeledPoint from pyspark.sql.functions import col label_points = (indexed .select(col(label_col).alias("label"), col("features")) .map(lambda row: LabeledPoint(row.label, row.features))) 
  • Как извлечь неконтролируемые кластеры из процесса Дирихле в PyMC3?
  • Tensorflow SKCompat преобразует значения float32 в Pandas dataframe в значения tf.float64, а затем дает ошибку
  • Как преобразовать массивы numpy в стандартный формат TensorFlow?
  • В чем разница между cross_val_score с scoring = 'roc_auc' и roc_auc_score?
  • Извлечение медицинской информации с использованием Python
  • Пользовательские цвета кластеров SciPy dendrogram в Python (link_color_func?)
  • Может ли Keras с поддержкой Tensorflow принудительно использовать процессор или графический процессор?
  • import input_data MNIST shadoworflow не работает
  • Python - лучший язык программирования в мире.