spark机器学习构建回归模型

12 篇文章 0 订阅
4 篇文章 0 订阅
from pyspark import SparkContext


sc=SparkContext("local[4]","first spark app")
raw_data=sc.textFile("E:\sparkLearning\Bike-Sharing-Dataset\hour.csv")
records=raw_data.map(lambda x:x.split(","))
num_data=raw_data.count()
first=records.first()
print(first)
print(num_data)
records.cache()
def get_mapping(rdd,idx):
    return rdd.map(lambda fields:fields[idx]).distinct().zipWithIndex().collectAsMap()
print("Mapping of first categorical feature column: %s"%get_mapping(records,2))

mappings=[get_mapping(records,i) for i in range(2,10)]
cat_len=sum(map(len,mappings))
num_len=len(records.first()[11:15])
total_len=num_len+cat_len

print("Feature vector length for categorical features: %d"%cat_len)
print("Feature vector length for numerical features: %d"%num_len)
print("Total feature vector length: %d"%total_len)

from pyspark.mllib.regression import  LabeledPoint
import numpy as np
def extract_features(record):
    cat_vec=np.zeros(cat_len)
    i=0
    step=0
    for field in record[2:9]:
        m=mappings[i]
        idx=m[field]
        cat_vec[idx+step]=1
        i=i+1
        step=step+len(m)
    num_vec=np.array([float(field) for field in record[10:14]])
    return np.concatenate((cat_vec,num_vec))

def extract_label(record):
    return float(record[-1])

data=records.map(lambda r:LabeledPoint(extract_label(r),extract_features(r)))
first_point=data.first()
print("原始特征向量Raw data: "+str(first[2:]))
print("原始特征标签Label: "+str(first_point.label))
print("对特征进行热编码之后的特征向量Linear Model feature vector :\n"+str(first_point.features))
print("对特征进行热编码之后的特征向量的长度Linear Model feature vector length:"+str(len(first_point.features)))

def extract_features_dt(record):
    return np.array(record[2:14])

data_dt = records.map(lambda point: LabeledPoint(extract_label(point), extract_features_dt(point)))
first_point_dt=data_dt.first()
print("决策树特征向量:\n"+str(first_point_dt.features))
print("决策树特征向量长度:"+str(len(first_point_dt.features)))

from pyspark.mllib.regression import LinearRegressionWithSGD
from pyspark.mllib.tree import DecisionTree
liner_model=LinearRegressionWithSGD.train(data,iterations=10,step=0.1,intercept=False)
true_vs_predicted=data.map(lambda p:(p.label,liner_model.predict(p.features)))
print("线性回归对前五个样本的预测:\n"+str(true_vs_predicted.take(5)))

dt_model=DecisionTree.trainRegressor(data_dt,{})
preds=dt_model.predict(data_dt.map(lambda p:p.features))
actual=data.map(lambda p:p.label)
true_vs_predicted_dt=actual.zip(preds)
print(" 决策树预测值:"+str(true_vs_predicted_dt.take(5)))
print("决策树深度:"+str(dt_model.depth()))
print("决策树节点个数:"+str(dt_model.numNodes()))

def squared_error(actual,pred):
    return (pred-actual)**2

def abs_error(actual,pred):
    return np.abs(pred-actual)

def squared_log_error(pred,actual):
    return (np.log(pred+1)-np.log(actual+1))**2


mse=true_vs_predicted.map(lambda point:squared_error(point[0],point[1])).mean()
mae=true_vs_predicted.map(lambda p:abs_error(p[0],p[1])).mean()
rmsle=np.sqrt(true_vs_predicted.map(lambda p:squared_log_error(p[0],p[1])).mean())
print("Linear Model - Mean Squared Error : %2.4f"%mse)
print("Linear Model - Mean Absolute Error : %2.4f"%mae)
print("Linear Model - Root Mean Squared Log Error : %2.4f"%rmsle)


mse_dt=true_vs_predicted_dt.map(lambda point:squared_error(point[0],point[1])).mean()
mae_dt=true_vs_predicted_dt.map(lambda p:abs_error(p[0],p[1])).mean()
rmsle_dt=np.sqrt(true_vs_predicted_dt.map(lambda p:squared_log_error(p[0],p[1])).mean())
print("Decision Tree - Mean Squared Error : %2.4f"%mse_dt)
print("Decision Tree - Mean Absolute Error : %2.4f"%mae_dt)
print("Decision Tree - Root Mean Squared Log Error : %2.4f"%rmsle_dt)

import matplotlib.pyplot as plt
# targets=records.map(lambda r:float(r[-1])).collect()
# plt.hist(targets,bins=40,color="lightblue",normed=True)
# fig=plt.gcf()
# fig.set_size_inches(16,10)
# plt.show()

# log_targets=records.map(lambda r: np.log(float(r[-1]))).collect()
# plt.hist(log_targets,bins=40,color="lightblue",normed=True)
# fig=plt.gcf()
# fig.set_size_inches(12,6)
# plt.show()

# sqrt_targets=records.map(lambda r: np.sqrt(float(r[-1]))).collect()
# plt.hist(sqrt_targets,bins=40,color="lightblue",normed=True)
# fig=plt.gcf()
# fig.set_size_inches(16,10)
# plt.show()

data_log=data.map(lambda lp:LabeledPoint(np.log(lp.label),lp.features))
model_log=LinearRegressionWithSGD.train(data_log,iterations=10,step=0.1)
r=true_vs_predicted_log=data_log.map(lambda p:(np.exp(p.label),np.exp(model_log.predict(p.features))))
mse_log=true_vs_predicted_log.map(lambda point:squared_error(point[0],point[1])).mean()
mae_log=true_vs_predicted_log.map(lambda p:abs_error(p[0],p[1])).mean()
rmsle_log=np.sqrt(true_vs_predicted_log.map(lambda p:squared_log_error(p[0],p[1])).mean())
print("Linear Model - Mean Squared Error : %2.4f"%mse_log)
print("Linear Model - Mean Absolute Error : %2.4f"%mae_log)
print("Linear Model - Root Mean Squared Log Error : %2.4f"%rmsle_log)
print("Non log-transfromed predictions:\n"+str(true_vs_predicted.take(3)))
print("Log_transformed predictions:\n"+str(true_vs_predicted_log.take(3)))


data_dt_log=data_dt.map(lambda lp:LabeledPoint(np.log(lp.label),lp.features))
dt_model_log=DecisionTree.trainRegressor(data_dt_log,{})
preds_log=dt_model_log.predict(data_dt_log.map(lambda p:p.features))
actual_log=data_dt_log.map(lambda p:p.label)
true_vs_predicted_dt_log=actual_log.zip(preds_log).map(lambda p:(np.exp(p[0]),np.exp(p[1])))
#均方误差
mse_log_dt=true_vs_predicted_dt_log.map(lambda point:squared_error(point[0],point[1])).mean()
#平均绝对误差
mae_log_dt=true_vs_predicted_dt_log.map(lambda p:abs_error(p[0],p[1])).mean()
#均方根对数误差
rmsle_log_dt=np.sqrt(true_vs_predicted_dt_log.map(lambda p:squared_log_error(p[0],p[1])).mean())

print("Decision Tree - Mean Squared Error : %2.4f"%mse_log_dt)
print("Decision Tree  - Mean Absolute Error : %2.4f"%mae_log_dt)
print("Decision Tree - Root Mean Squared Log Error : %2.4f"%rmsle_log_dt)
print("Non log-transfromed predictions:\n"+str(true_vs_predicted_dt.take(3)))
print("Log_transformed predictions:\n"+str(true_vs_predicted_dt_log.take(3)))

#划分测试集和训练集
data_with_idx=data.zipWithIndex().map(lambda k_v:(k_v[1],k_v[0]))
test=data_with_idx.sample(False,0.2,42)
train=data_with_idx.subtractByKey(test)

train_data=train.map(lambda idx_p:idx_p[1])
test_data=test.map(lambda idx_p:idx_p[1])
train_size=train_data.count()
test_size=test_data.count()
print("训练集大小:%d"%train_size)
print("测试集大小: %d"%test_size)
print("总数据大小: %d"%num_data)
print("训练集+测试集大小:%d"%(train_size+test_size))

data_with_idx_dt=data_dt.zipWithIndex().map(lambda k_v:(k_v[1],k_v[0]))
test_dt=data_with_idx_dt.sample(False,0.2,42)
train_dt=data_with_idx_dt.subtractByKey(test)

train_data_dt=train_dt.map(lambda idx_p:idx_p[1])
test_data_dt=test_dt.map(lambda idx_p:idx_p[1])

#评估参数

def evaluate(train,test,iterations,step,regParam,regType,intercept):
    model=LinearRegressionWithSGD.train(train,iterations,step,regParam=regParam,regType=regType,intercept=intercept)
    tp=test.map(lambda p:(p.label,model.predict(p.features)))
    rmsle=np.sqrt(tp.map(lambda p:squared_log_error(p[0],p[1])).mean())
    return rmsle
#迭代次数变化
params=[1,5,10,20,50,100,125,150,175,200]
metrics=[evaluate(train_data,test_data,param,0.01,0.0,'l2',False) for param in params]
print(params)
print(metrics)

# plt.plot(params,metrics)
# fig=plt.gcf()
# plt.xscale('log')
# plt.show()
#步长变化
params=[0.01,0.025,0.05,0.075,0.1,1.0]
metrics=[evaluate(train_data,test_data,10,param,0.0,'l2',False) for param in params]
print(params)
print(metrics)
# plt.plot(params,metrics)
# fig=plt.gcf()
# plt.xscale('log')
# plt.show()

#L2正则化
params=[0.0,0.01,0.1,1.0,5.0,10.0,20.0]
metrics=[evaluate(train_data,test_data,10,0.1,param,'l2',False) for param in params]
print(params)
print(metrics)
# plt.plot(params,metrics)
# fig=plt.gcf()
# plt.xscale('log')
# plt.show()

#L1正则化
params=[0.0,0.01,0.1,1.0,10.0,100.0,1000.0]
metrics=[evaluate(train_data,test_data,10,0.1,param,'l1',False) for param in params]
print(params)
print(metrics)
# plt.plot(params,metrics)
# fig=plt.gcf()
# plt.xscale('log')
# plt.show()

#截距
params=[False, True]
metrics=[evaluate(train_data,test_data,10,0.1,10,'l2',param) for param in params]
print(params)
print(metrics)
# plt.bar(params,metrics,color="lightblue")
# fig=plt.gcf()
# plt.show()


#决策树性能分析

def evaluate_dt(train,test,maxDepth,maxBins):
    model=DecisionTree.trainRegressor(train,{},impurity='variance',maxDepth=maxDepth,maxBins=maxBins)
    preds=model.predict(test.map(lambda p:p.features))
    actual=test.map(lambda p:p.label)
    tp=actual.zip(preds)
    rmsle=np.sqrt(tp.map(lambda p:squared_log_error(p[0],p[1])).mean())
    return  rmsle
#树深度
params=[1,2,3,4,5,10,20]
metrics=[evaluate_dt(train_data_dt,test_data_dt,param,32) for param in params]
print(params)
print(metrics)
# plt.plot(params,metrics)
# fig=plt.gcf()
# plt.show()

#最大划分树
params=[2,4,8,16,32,64,100]
metrics=[evaluate_dt(train_data_dt,test_data_dt,5,param) for param in params]
print(params)
print(metrics)
plt.plot(params,metrics)
fig=plt.gcf()
plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark机器学习库MLlib是一个基于Spark平台的分布式机器学习库,它提供了一系列常用的机器学习算法和工具,包括分类、回归、聚类、协同过滤、降维等。使用MLlib可以方便地进行大规模的机器学习任务,同时也支持在线学习和增量学习等高级功能。在编程实践中,我们可以使用MLlib来构建机器学习模型,对数据进行预处理和特征工程,进行模型训练和评估等。同时,MLlib还支持与其他Spark组件的无缝集成,如Spark SQL、Spark Streaming等,可以实现更加复杂的机器学习应用场景。 ### 回答2: Spark机器学习库MLlib是一个强大的分布式机器学习框架,原生支持Spark的分布式计算,可以处理大规模的数据集,并提供一系列常见的机器学习算法和工具,包括分类、回归、聚类、推荐等。 MLlib的编程实践主要分为以下几个步骤: 1. 数据预处理 在使用MLlib进行机器学习之前,需要对数据进行预处理,清洗和准备工作,如数据清洗、缺失值填充、特征选择、特征缩放等。MLlib对数据的处理和转换有良好的支持,可以使用Spark的数据处理和转换函数以及MLlib的特征处理函数进行数据的预处理。 2. 特征工程 特征工程是机器学习过程中非常重要的一步,它可以帮助我们选择和构建合适的特征,减少噪声数据对模型的影响。MLlib提供了一系列特征处理函数,如特征标准化、特征编码、特征提取等,可以帮助用户方便地进行特征工程的实践。 3. 模型训练 MLlib支持多种机器学习算法,包括分类、回归、聚类和推荐系统等,用户可以选择合适的算法对数据进行建模和训练。在模型训练过程中,需要进行参数选择和调优,可以通过交叉验证等方法选择最佳的模型和参数。 4. 模型评估和选择 在训练和调优完成后,需要对训练好的模型进行评估和选择。MLlib提供了多种模型评估指标和方法,如准确率、召回率、F1值等,可以帮助用户选择最佳的模型和参数。 5. 预测和应用 在训练和评估好模型之后,就可以使用训练好的模型进行预测和应用了。MLlib提供了预测函数和模型保存与加载功能,可以帮助用户方便地进行模型应用。 总之,MLlib提供了一系列丰富的机器学习算法和工具,并且能够处理大规模数据集,有着非常广泛的应用场景。对于需要对海量数据进行机器学习的用户来说,MLlib的编程实践是非常重要的,需要深入理解其算法和实现方法,以便更好地应用到实际场景中。 ### 回答3: Spark机器学习库MLlib是一个开源的大数据机器学习库,它提供了一套强大的分布式机器学习工具,可以让我们在Spark中轻松地进行机器学习任务。 MLlib提供了许多常见的机器学习算法和工具,包括分类、回归、聚类、降维等,同时也支持常用的数据格式和数据预处理功能。同时,它还提供了很多便利的函数和工具,使得我们可以很方便地处理大规模数据集。 在进行MLlib编程实践时,我们需要掌握以下几个方面的知识: 1. 数据准备与处理:在进行机器学习任务之前,我们需要对数据进行预处理和准备。这包括数据清洗、特征提取、特征缩放、数据转化等,MLlib提供了许多工具和函数来帮助我们完成这些任务。 2. 算法选择与调优:根据我们的任务需求和数据特征,我们需要选择合适的机器学习算法,MLlib提供了常见的分类、回归、聚类、降维算法,我们需要根据具体情况进行选择和调优。 3. 模型训练和预测:在算法选择和调优完成后,我们需要对数据集进行模型训练和预测。这包括模型的拟合、评估、优化等。MLlib提供了很多训练和评估模型的函数和工具。 4. 分布式计算:MLlib是在分布式环境下运行的,因此我们需要掌握Spark集群的搭建和优化,以充分利用分布式计算的优势,提高计算效率和速度。 在进行MLlib编程实践时,我们需要先熟悉Spark的基本操作和RDD编程模型,然后进一步学习MLlib库的API和使用规则。同时,我们还需要深入了解机器学习算法和常见的数据处理和挖掘技术,以便对数据进行准备和处理。 总之,通过使用Spark机器学习库MLlib,我们可以快速地进行大规模数据集的机器学习任务,从而获得更多的洞见和价值。通过MLlib编程实践,我们可以提高自己的机器学习和大数据处理能力,从而更好地应对现代数据科学的挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值