机器学习简介
机器学习的场景
(1)确定性场景
(2)不确定性场景
现在大多数的公司中主要是应用机器学习技术来解决不确定场景的问题。例如,我们小组现在用机器学习对公司各个产品的用户进行优质客户分群,对每个产品的用户群做用户流失分析。那么,机器学习会给这种不确定性场景带来什么作用呢?主要是对这种不确定场景提供判断和预测,拿回实际场景,对每个用户进行判断是否会变成流失用户,预测这个用户将会在几天之后彻底不上线。对于判断和预测这两个字的背后,我们应该怎样去实现呢?在这里不提那些模型,算法,参数等理论,说的简单点,就是通过我们准备好的DataSet中找规律。这种规律并不是显视的,并不是2,4,6,8这种简单的规律,我们需要通过数据挖掘(是不是想到了蓝翔技校^_^)来挖掘出数据潜在的规律。
机器学习的模式:
按照计算场景来分(1) 离线批处理机器学习(2)实时处理机器学习
按照计算方式来分(1) 监督学习 (2)无监督学习 (3)半监督学习
离线批处理机器学习:
例如我们现在做的用户流失模型,每天定时的去计算离线数据
实时处理机器学习:
例如实时推荐系统,一条一条的数据流进来进行计算。使用这种实时机器学习的,多数是电商,今日头条,百度搜索的这种业务场景
无论是监督学习和无监督学习还是离线和实时,所用的算法都是一样的
今天分享给大家的是监督学习分类中的线性回归。
其中关于算法的推导以及线性回归的概念请自行百度吧,我只把我去其糟粕的东西写下来分享给大家
先举一个经典的例子,房价预测
e.g.:
area price 单位:$1000
2019 $480
1046 $400
866 $246
1768 $445
以上的数据,我们可以想象成是我们从地产公司搜集来的数据,一个非常大的数据集(尽管我只给出了四条)
下面是设定的变量
m = training examples 训练样本
x = “input” variables / features 输入变量 —> 特征 —> 房子大小
y = “output” variable 目标变量 —> 房价
(x,y)— training example 一个训练样本
做监督学习的流程大概是下面这样的
Training Set 训练数据
|
learning algorithm 选择的算法
|
x(输入变量) ——> hypothesis ——> y (输出变量)
(使用算法假设的计算函数)
我们设计学习算法,第一步我们要考虑的是 怎么去表示假设(h),在这个课题,我们要对假设进行线性表示
在对房价预测的时候,除了房屋面积的大小会影响,还有其他因素,例如 卧室的数量
我们在预测的过程中,为了使得预测的结果精准,我们希望 min =1/2 $ (h(x) - y)2的平方,也就是h(x)预测值和y实际结果的方差最小。
在这个计算的过程,我们需要调整我们的参数$,使得求得的平方差最小,并且这里乘以一个二分之一,为了方便我们接下来的计算,需要找到能使平方差最小化的算法,梯度下降算法:如果你有很多的训练集合,可以使用随机下降算法!大规模的数据集,随即下降通常会快得多。但是,随机下降算法不会精确到全局最小值。
上面我只写了一个计算任务的大体框架,细节部分留给有兴趣的人自己去补充,计算公式涉及的是线性代数,最小平方回归,最小二乘法之类的,也请拿起数学课本,去体验下那种折磨吧哈哈哈
推荐大家去看 吴恩达的课程,挺基础的,可以当做入门课程
我平常是使用spark Mlib开发的,所以下面给出一个spark官方的代码示例,理论和实践相结合
官方给出的是使用spark 1.x编写的,大家可以试一试用spark 2.x来写,spark 2.x对ML的支持度更好
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.regression.LinearRegressionModel
import org.apache.spark.mllib.regression.LinearRegressionWithSGD
// $example off$
@deprecated("Use ml.regression.LinearRegression or LBFGS", "2.0.0")
object LinearRegressionWithSGDExample {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("LinearRegressionWithSGDExample")
val sc = new SparkContext(conf)
// $example on$
// Load and parse the data
val data = sc.textFile("data/mllib/ridge-data/lpsa.data")
val parsedData = data.map { line =>
val parts = line.split(',')
LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))
}.cache()
// Building the model
val numIterations = 100
val stepSize = 0.00000001
val model = LinearRegressionWithSGD.train(parsedData, numIterations, stepSize)
// Evaluate model on training examples and compute training error
val valuesAndPreds = parsedData.map { point =>
val prediction = model.predict(point.features)
(point.label, prediction)
}
val MSE = valuesAndPreds.map{ case(v, p) => math.pow((v - p), 2) }.mean()
println("training Mean Squared Error = " + MSE)
// Save and load model
model.save(sc, "target/tmp/scalaLinearRegressionWithSGDModel")
val sameModel = LinearRegressionModel.load(sc, "target/tmp/scalaLinearRegressionWithSGDModel")
// $example off$
sc.stop()
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。