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
def test_data_prepare(spark, filename, header): # 若只是处理较少数据时,为提升速度应启用该函数 test_header, rdd = fw.read_data(spark, filename) # 初步清洗表头 test_header = list(test_header.split(',')) test_header.pop(0) # # 若要进行并发应该启用该函数 # test_header, rdd = fw.read_list_data(spark, filename) # 将文件中数量级过大的数据转换为合适的规格 rdd = annual_premium_scaler(spark, rdd, test_header) # 将相关性强的特征进行合并 rdd, test_header = damaged_couple(rdd, test_header) # 将年龄进行定性化 rdd = arrange_for_age(rdd, test_header) # 根据清洗后的训练集的表头筛选要保留的列并将其记录到列表中 num_array = [] for i in range(len(test_header)): if test_header[i] in header: num_array.append(i) # 根据列表过滤数据 def map_fuc(row): ret = [] for n in num_array: ret.append(row[n]) return ret rdd = rdd.map(map_fuc) # 将格式转换为机器学习算法所需要的格式 def Vectors_map_fuc(row): features_array = np.array(row) index_array = np.arange(features_array.size) num = features_array.size return (Vectors.sparse(num, index_array, features_array), ) labeled_points_rdd = rdd.map(Vectors_map_fuc) data = spark.createDataFrame(labeled_points_rdd, schema=['indexedFeatures']) data = VectorIndexer(inputCol="indexedFeatures", outputCol="features", maxCategories=4).fit(data).transform(data) # 过滤掉不需要的表头 data = data.drop("indexedFeatures") return data.cache()