将带有分类数据的csv转换为libsvm

时间:2015-07-16 05:03:49

标签: apache-spark libsvm apache-spark-mllib

我正在使用spark MLlib来构建机器学习模型。如果数据中存在分类变量,我需要将libsvm格式文件作为输入。

我尝试使用csv文件转换为libsvm 1. Convert.c网站建议的libsvm 2. Csvtolibsvm.py phraug

中的github

但这两个脚本似乎都没有转换分类数据。 我还安装了weka并尝试保存为libsvm格式。但是在weka explorer中无法找到该选项。

请建议使用分类数据csv转换为libsvm格式的任何其他方式,或者告诉我这里是否遗漏了任何内容。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我想你想训练一个SVM。它需要输入rdd [LabeledPoint]。

https://spark.apache.org/docs/1.4.1/api/scala/#org.apache.spark.mllib.classification.SVMWithSGD

我建议您将分类列与第二个答案类似:

How to transform a categorical variable in Spark into a set of columns coded as {0,1}?

其中LogisticRegression案例与SVM案例非常相似。

答案 1 :(得分:0)

您可以尝试使用哈希技巧将分类功能转换为数字,然后将数据帧转换为rdd(如果命令将功能映射到每一行)。 使用pyspark解决了以下假设示例。

例如,convertion的数据帧是df:

>> df.show(5)

+------+----------------+-------+-------+
|gender|            city|country|     os|
+------+----------------+-------+-------+
|     M|         chennai|     IN|ANDROID|
|     F|       hyderabad|     IN|ANDROID|
|     M|leighton buzzard|     GB|ANDROID|
|     M|          kanpur|     IN|ANDROID|
|     F|       lafayette|     US|    IOS|
+------+----------------+-------+-------+

我想使用功能:yob,city,country来预测性别。

import hashlib
from pyspark.sql import Row
from pyspark.ml.linalg import SparseVector

spark = SparkSession \
    .builder \
    .appName("Spark-app")\
     .config("spark.some.config.option", "some-value")\
    .getOrCreate() # create the spark session

NR_BINS = 100000 # the total number of categories, it should be a big number if you have many different categories in each feature and a lot of categorical features. in the meantime do consider the memory.

def hashnum(input):
    return int(hashlib.md5(input).hexdigest(), 16)%NR_BINS + 1

def libsvm_converter(row):
    target = "gender"
    features = ['city', 'country', 'os']
    if row[target] == "M":
        lab = 1
    elif row[target] == "F":
        lab = 0
    else:
        return
    sparse_vector = []
    for f in features:
        v = '{}-{}'.format(f, row[f].encode('utf-8'))
        hashv = hashnum(v) # the index in libsvm
        sparse_vector.append((hashv, 1)) # the value is always 1 because of categorical feature
    sparse_vector = list(set(sparse_vector)) # in case there are clashes (BR_BINS not big enough)
    return Row(label = lab, features=SparseVector(NR_BINS, sparse_vector))


libsvm = df.rdd.map(libsvm_converter_2)
data = spark.createDataFrame(libsvm)

如果你检查数据,它会是这样的;

>> data.show()
+--------------------+-----+
|            features|label|
+--------------------+-----+
|(100000,[12626,68...|    1|
|(100000,[59866,68...|    0|
|(100000,[66386,68...|    1|
|(100000,[53746,68...|    1|
|(100000,[6966,373...|    0|
+--------------------+-----+