文档章节

KTV歌曲推荐-PCA降维+逻辑回归-性别预测及过拟合处理

sharpcx
 sharpcx
发布于 03/06 14:39
字数 852
阅读 1.4W
收藏 24

3 月,跳不动了?>>>

前言

上一篇使用逻辑回归预测了用户性别,由于矩阵比较稀疏所以会影响训练速度。所以考虑降维,降维方案有很多,本次只考虑PCA和SVD。

PCA和SVD原理

有兴趣的可以自己去研究一下 https://medium.com/@jonathan_hui/machine-learning-singular-value-decomposition-svd-principal-component-analysis-pca-1d45e885e491

我简述一下:

  • PCA是将高维数据映射到低维坐标系中,让数据尽量稀疏
  • SVD就是非方阵的PCA
  • 实际使用中SVD和PCA并无太大区别
  • 如果特征大于数据记录数,并不能有好的效果,具体原因自己可以去看。

代码

数据获取和处理

以前文章写过很多次,这里略过 原数据shape为:2000*1900

PCA和矩阵转换

查看最佳维度数

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
pca = PCA().fit(song_hot_matrix)
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance');

从图中可以看出大概1500维度已经可以达到90+解释性

保留99%矩阵解释性

pca = PCA(n_components=0.99, whiten=True)
song_hot_matrix_pca = pca.fit_transform(song_hot_matrix)

得到压缩后特征为: 2000*1565 并没有压缩多少

模型训练

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"   # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation, Embedding,Flatten,Dropout
import matplotlib.pyplot as plt
from keras.utils import np_utils
from sklearn import datasets
from sklearn.model_selection import train_test_split

n_class=user_decades_encoder.get_class_count()
song_count=song_label_encoder.get_class_count()
print(n_class)
print(song_count)

train_X,test_X, train_y, test_y = train_test_split(song_hot_matrix_pca,
                                                   decades_hot_matrix,
                                                   test_size = 0.2,
                                                   random_state = 0)
train_count = np.shape(train_X)[0]
# 构建神经网络模型
model = Sequential()
model.add(Dense(input_dim=song_hot_matrix_pca.shape[1], units=n_class))
model.add(Activation('softmax'))

# 选定loss函数和优化器
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# 训练过程
print('Training -----------')
for step in range(train_count):
    scores = model.train_on_batch(train_X, train_y)
    if step % 50 == 0:
        print("训练样本 %d 个, 损失: %f, 准确率: %f" % (step, scores[0], scores[1]*100))
print('finish!')

训练结果:

训练样本 4750 个, 损失: 0.371499, 准确率: 83.207470
训练样本 4800 个, 损失: 0.381518, 准确率: 82.193959
训练样本 4850 个, 损失: 0.364363, 准确率: 83.763909
训练样本 4900 个, 损失: 0.378466, 准确率: 82.551670
训练样本 4950 个, 损失: 0.391976, 准确率: 81.756759
训练样本 5000 个, 损失: 0.378810, 准确率: 83.505565

测试集验证:

# 准确率评估
from sklearn.metrics import classification_report
scores = model.evaluate(test_X, test_y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))


Y_test = np.argmax(test_y, axis=1)
y_pred = model.predict_classes(song_hot_matrix_pca.transform(test_X))
print(classification_report(Y_test, y_pred))

accuracy: 50.20%

很明显已经过拟合

处理过拟合-增加Dropout

这里使用加Dropout,随机丢弃特征的方式处理过拟合,代码:

# 构建神经网络模型
model = Sequential()
model.add(Dropout(0.5))
model.add(Dense(input_dim=song_hot_matrix_pca.shape[1], units=n_class))
model.add(Activation('softmax'))

accuracy:70%

处理过拟合-L1L2正则

这里给权重增加正则

# 构建神经网络模型
model = Sequential()
model.add(Dense(input_dim=song_hot_matrix_pca.shape[1], units=n_class, kernel_regularizer=regularizers.l2(0.01)))
model.add(Activation('softmax'))

accuracy:62%

Well Done

其实SVD的做法与PCA类似,这里不再演示。经过我测试发现,在我的数据集上,PCA虽然加快了训练速度,但是丢弃了太多特征,导致数据很容易过拟合。加入Dropout或者增加正则相可以改善过拟合的情况,下一篇会分享自编码降维。

© 著作权归作者所有

sharpcx
粉丝 22
博文 11
码字总数 10082
作品 0
海淀
程序员
私信 提问
加载中

评论(4)

clevertension
clevertension
不明觉厉
sharpcx
sharpcx 博主
过奖过奖
weiqiyou
weiqiyou
放松放松
sharpcx
sharpcx 博主
嗯~
吴恩达《机器学习》课程总结(19)总结

(1)涉及到的算法 1.监督学习:线性回归,逻辑回归,神经网络,SVM。 线性回归(下面第三行x0(i)其实是1,可以去掉) 逻辑回归 神经网络(写出前向传播即可,反向框架会自动计算) SVM 2.非监...

ysyouaremyall
2018/07/07
0
0
吴恩达《机器学习》课程总结(14)降维

14.1动机一:数据压缩 将特征进行降维,如将相关的二维降到一维: 三维变二维: 以此类推把1000维数据降成100维数据。 14.2动机二:数据可视化 如50个维度的数据是无法进行可视化的,使用降维...

youaremyall
2018/07/04
0
0
吴恩达机器学习-Chapter 15 降维

目的:降维的应用、概念、及算法。降维的3个目的:数据压缩、加速算法(缩小特征变量)、数据可视化。降维本身也是一种无监督学习算法。 1. Lesson 115 数据压缩     1. 目的:降维的第一...

数据追随者
2019/05/01
0
0
Netty【6】要么不开始,要么一辈子

序言:简单版websocket发消息,简单开发前端发送消息,后端接收消息并返回。 1、故事牵引 今天通过一个故事来讲解netty,主要讲client和server端和下面的主要实现类。 客户要去ktv唱歌,进入...

木九天
2019/07/23
85
0
干货 :如何选择适当的机器学习算法

在决定使用哪种算法时,必须考虑数据的类型和种类。一些算法只需要少量样本,另一些则需要大量样本。某些算法只能处理特定类型的数据。例如,朴素贝叶斯算法与分类数据相得益彰,但对缺失数据...

技术小能手
2018/07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SSM框架整合

mybatis逆向工程 mybatis-generator生成pojo、mapper接口及映射文件 mapper放到e3-manager-dao层中 导入sql到数据库中; 导入逆向工程工具,配置xml文件 运行main方法 重复运行main不会覆盖!...

七宝1
33分钟前
25
0
OSChina 周日乱弹 —— 和网友的第一次开房经历

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《Ljósið》- Ólafur Arnalds 手机党少年们想听歌,请使劲儿戳(这里) @xiaos...

小小编辑
50分钟前
23
0
程序员职业生涯指引

程序员应该尽早规划自己的职业生涯 为什么写 众所周知 IT 这一行到了一定的年龄、大部分人都或多或少有危机感,特别是今年全国乃至全球发生的疫情、导致整体经济受到很大的影响、这次的疫情影...

科比可比克
今天
11
0
JVM调优实战分析

一、查看服务器项目JVM参数以及参数分析 1、jps 命令 : 列出系统中所有的 Java 应用程序以及PID 如下图所示,26647就是我部署在服务器的一个小项目的 PID 2、jmap命令:查看堆的使用情况 如...

IT-Mamba
今天
29
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部