Пример #1
0
def training_data_prepare(spark, filename):
    # 若只是处理较少数据时,为提升速度应启用该函数
    header, rdd = fw.read_data(spark, filename)
    # 初步过滤表头
    header = list(header.split(','))
    header.pop(0)

    # # 若要进行并发应该启用该函数
    # header, rdd = fw.read_list_data(spark, filename)
    # 打印数据的记录数、最大值、最小值、平均值以及标准差,以及计算皮尔逊相关系数
    personal_array = data_description(spark, rdd.cache(), header)
    # 打印数据的皮尔逊相关系数
    personal_show(personal_array, header)
    # 将文件中数量级过大的数据转换为合适的规格
    rdd = annual_premium_scaler(spark, rdd, header)
    # 将线性相关性强的特征进行合并
    rdd, header = damaged_couple(rdd, header)
    # 将年龄进行定性化
    rdd = arrange_for_age(rdd, header)
    # 使用卡方验证二次清洗数据
    cleaned_rdd, cleaned_header = useful_select(spark, rdd, header)

    def map_fuc_rdd(row):
        ret = []
        for i in range(len(row) - 1):
            ret.append(row[i])

        return ret, row[-1]

    cleaned_rdd = cleaned_rdd.map(map_fuc_rdd)

    # 设置PCA降维的维度
    # n = 3
    # pp.PCA_builder(spark,rdd,n)
    # 将数据格式转换为机器学习所要求的格式
    def map_fuc(row):
        features_array = np.array(row[0])
        index_array = np.arange(features_array.size)
        num = features_array.size

        return row[1], Vectors.sparse(num, index_array, features_array)

    labeled_points_rdd = cleaned_rdd.map(map_fuc)
    # print(labeled_points_rdd.first())
    data = spark.createDataFrame(labeled_points_rdd,
                                 schema=['label', 'indexedFeatures'])
    # 使用特征转换器进行对数据的进一步处理
    data = VectorIndexer(inputCol="indexedFeatures",
                         outputCol="features",
                         maxCategories=4).fit(data).transform(data)
    # 筛选掉无用的列
    data = data.drop("indexedFeatures")
    data = balanceDataset(data)
    # 将数据集分为训练集和测试集
    training_data, check_data = data.randomSplit([0.7, 0.3])
    # 对小类进行过采样
    training_data = enlarge_data(training_data, 0.15)
    return training_data.cache(), check_data.cache(), cleaned_header