天池离线赛——移动推荐算法学习笔记3_基于模型的预测

参考代码:https://blog.csdn.net/snoopy_yuan

该部分主要是基于模型的预测;

包括数据预处理(处理数据不平衡问题),LR模型预测等;

数据预处理部分思想:首先数据严重不平衡(1:3k),这里采用下采样的办法处理;为避免下采样失去了数据原本的分布特征,所以先使用kmeans聚类;然后在每个类别上取sub_sample;与正样本组成训练集。

1. 机器学习中数据不平衡的处理:

数据不平衡:数据分布不均匀;

解决方法:

1)采样:又分为上采样和下采样;

上采样:复制多遍小规模的数据;

下采样:删除部分大规模的数据;

2)数据合成

3)一分类
4)加权

详见参考链接;

参考:https://www.cnblogs.com/zhaokui/p/5101301.html


2. 归一化处理

对不同度量尺度的特征进行归一化处理,使用sklearn.preprocessing.StandardScaler()


下面是用逻辑回归解决该问题:

1. 回顾了一下逻辑回归是什么(其实是重新学习了一下= =)

简单来说,对于一个二分类问题,设最终分类目标为y,其有两个取值0或1。训练的目的就是,输入一个特征向量x,训练得到参数w和b,首先得到z,再通过激活函数f(z),将取值限制在(0,1)之间。f(z)可以理解为y=1的后验概率,即P(y=1|x)。

在逻辑回归中,激活函数取sigmod函数,其是在负无穷到正无穷上的连续函数,取值在(0,1)之间。

(公式不好写 这里就不写了。以上纯粹是为了个人理一下思路。)

z=wx+b, y=f(z); 

逻辑回归的损失函数:

上面已经说了,可以将f(z)理解为y取正类的概率;则根据极大似然原理(?),该组训练样本在所有可能样本中出现的可能性最大,所以将各f(z)相乘;即要找使得乘积最大的参数w和b。

然后再一顿操作,(详见参考网址),得到损失函数。

参考:https://blog.csdn.net/zjuPeco/article/details/77165974


2. panda的sample方法:

功能:数据的取样;

参数:frac:取数据中的百分之多少;

n:取数据中的多少条;

参考:https://blog.csdn.net/qq_22238533/article/details/71080942

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sample.html


3. pandas的as_matrix()方法:

(表示看不懂这个方法什么意思)


4. numpy的concatenate()方法:

功能:就是把两个数组,DataFrame也好,[ [] ]也好,摞在一起;有两种摞的方法,用参数axis控制。

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])

参考:https://blog.csdn.net/u013713117/article/details/54587555


0618继续补充


5. 关于k-means聚类;

简介:k-means,硬聚类算法,是基于距离的;

算法过程:

1)从初始点中选取k个点,作为簇的中心,即质心;

2)对其余每一个点,根据其距簇中心点的距离,将其归类到某一个簇;

3)对于形成的各簇,从新计算各簇的质心;

4)重复2)、3)过程,直至新质心与原质心相同,或距离小于某阈值;

要点:

1)最后的结果是聚类成了k类;

2)在python中,可以通过XXX方法实现。(待补充


6. 数据归一化处理

归一化处理的目的:消除特征件不同量纲的影响。

(不同量纲的意思,举个栗子:

预测房价,其中房屋中卧室的数量和坐地面积都是特征;卧式数量取值大概在1,2,3,即10十以内的数字。(不排除超大的房子有几十个卧式,已经超出我的想象力了)。而坐地面积基本上在100平米左右(同样贫穷限制了我的想象力)。则在建立损失函数的模型时,关于这两个特征,损失函数是一个扁平的形状。(在坐地面积轴上,损失函数下降速度慢;在卧式数量轴上,下降速度快,(因为取值范围小,所以每变化一下,对损失函数值影响程度大)。)。这对模型训练带来影响:训练速度慢;也会影响训练结果。因此要进行数据归一化处理,让所有特征取值处于同一数量等级。

)栗子完毕。

两种常用归一化方法:

1)Standardization,量化后的特征服从标准正态分布;


量化后的特征分布在[-1,1]区间。

2)Min-Max Scaling


量化后的特征分布在[0,1]区间。


7. 关于sklearn.preprocessing.StandardScaler:

首先这是个类,可以用来实例化对象:

scaler_1=preprocessing.StandardScaler()

作用:计算数据集的均值和标准差;

与preprocessing.scale的区别:

preprocessing.StandardScaler(),可以保存训练数据集的均值和标准差,用来实现对测试数据集进行相同的变换;

几个方法:

scaler_1.fit(X) #对数据集X,计算均值和标准差;

scaler_1.transform(Y) # 对测试数据集Y进行相同的变换;

问题:emm什么叫相同的变换?为什么要进行相同的变换?(大概知道原因);但为什么?

参考:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

https://blog.csdn.net/csmqq/article/details/51461696


8. 关于MiniBatchKMeans:

是个类;

mbk_1=MiniBatchKMeans(init='k-means++',n_cluster=8,batch_size=100)

参数解释:

init,不懂;

n_cluster,分成几簇;

batch_size,不懂;(所以我到底解释了些什么=。=)

具体参数看官方介绍,即如下链接。(感叹,有啥问题还是得看官方解释,再看个栗子,所向披靡。嘻。)

一个重要方法:

mbk_1.fit(X) #得到数据集X的质心;

属性:

mbk_1.labels_:每个点的label;

注意点:

与Kmeans的区别:

在每次迭代过程中,对数据进行抽样,不适用所有数据进行计算;即,确定质心后,从数据集中选取小批量数据,把他们分配给最近的质心。选取的小批量数据的数据量取决于参数:batch_size。

参考:http://scikit-learn.org/stable/modules/generated/sklearn.cluster.MiniBatchKMeans.html

与kmeans的区别:https://blog.csdn.net/sinat_26917383/article/details/70240628


第二部分:关于LR模型部分的解释:

1. 机器学习中的准确率,召回率等的解释:

真正率:做出positive的判断,且判断正确;

假正率:做出positive的判断,但判断错误;

真负率:做出negative的判断,且判断正确;

假负率:做出negative的判断,但判断错误。

precision = TP / (TP + FP)
recall = TP / (TP + FN)
accuracy = (TP + TN) / (TP + FP + TN + FN)
F1 Score = P*R/2(P+R),其中P和R分别为 precision 和 recall
若模型训练得到了几个模型,通常选择在验证集上F1 Score值最大的一个。

参考:https://blog.csdn.net/simplelovecs/article/details/50520602


第三部分:RF模型部分的解释:

1. 随机森林的简介:

用于分类问题;可以理解为由多个决策树组成,每个决策树决定一个类别;随机森林集中各分类结果,将次数最多的类别作为最终类别;

大致过程是:构造每一颗决策树;

每颗决策树的构造:

设总的训练数据集中样本数为N,总特征数为M;

1)从N个样本中,随机不放回的抽取N个数据;

2)对于决策树中的每个节点,从M个特征中选取m个特征(m应远小于M);从这m个特征中按一定规则选取一个特征,作为当前节点;

详见另一篇博客:https://blog.csdn.net/shelly_Chestnut/article/details/80729338


2. 

你可能感兴趣的:(机器学习)