ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

机器学习——Week3

2021-10-10 18:34:33  阅读:184  来源: 互联网

标签:机器 回归 fft 学习 np print import Week3 sklearn


文章目录


提示:以下是本篇文章正文内容,下面案例可供参考

一、逻辑回归

多元线性回归(Ridge、Lasso、ElasticNet)是做回归预测的
逻辑回归(Logistic Regression)是做分类任务的

在这里插入图片描述

1.前言引入

Q:做回归预测损失函数是什么?
A:平方均值损失函数MSE

Q:做分类损失函数是什么?
A:做分类损失函数是交叉熵!

Q:什么是熵?
A:熵是一种测量分子不稳定性的指标,分子运动越不稳定,熵就越大,来自热力学
熵是一种测量信息量的单位,信息熵,包含的信息越多,熵就越大,来自信息论,香农
熵是一种测量不确定性的单位,不确定性越大,概率越小,熵就越大!

Q:熵和概率是什么一个关系?
A:随着概率的减小,熵会增大

2.简单介绍

Q:为什么本质是多元线性回归?
A:1,公式,首先应用了多元线性回归的公式,其次才是把多元线性回归的结果,交给sigmoid函数去进行缩放
2,导函数,逻辑回归的损失函数推导的导函数,整个形式上和多元线性回归基本一致,
只是y_hat求解公式包含了一个sigmoid过程而已

Q:逻辑回归的损失函数是什么?
A:交叉熵,做分类就用交叉熵,-ylogP,因为逻辑回归是二分类,所以
loss func = (-y
logP + -(1-y)*log(1-P)),也就是说我们期望这个损失最小然后找到最优解
事实上,我们就可以利用前面学过的梯度下降法来求解最优解了

Q:逻辑回归为什么阈值是0.5?
A:因为线性回归区间是负无穷到正无穷的,所以区间可以按照0来分成两部分,所以带到sigmoid公式里面去
z=0的话,y就等于0.5

Q:逻辑回归做多分类?
A:逻辑回归做多分类,把多分类的问题,转化成多个二分类的问题,如果假如要分三个类别,就需要同时
训练三个互相不影响的模型,比如我们n个维度,那么三分类,w参数的个数就会是(n+1)*3个参数
上面所谓的互不影响,指的是模型在梯度下降的时候,分别去训练,分别去下降,三个模型互相不需要
传递数据,也不需要等待收敛

Q:文字本身是几维的数据?音乐本身是几维的数据?图片本身是几维的数据?视频本身是几维的数据?
A:看什么类型的数据,文字一维的,音乐是单声道的音乐,音乐是一维的数据,如果音乐是双声道的,
就是二维的数据,图片如果看成是张图片,就是个平面二维的数据,视频一张张图片按时间顺序码放的,
那就是三维的数据
但我们做机器学习的时候,真的只会这样考虑吗?
文章是由不同的词组成的,词的种类越多,事实上考虑的维度就越多
图片如果是彩色的图片,图片可以有R、G、B、alpha
音乐可以有不同的频率,每个频率如果看成是一个维度,那么就可以N多个维度
图片也可以有不同的频率,每个频率如果看成是一个维度,那么就可以N多个维度

3.线性回归算法的选择

算法选择顺序,Ridge Regression (L2正则化) --> ElasticNet (即包含L1又包含L2)
–> Lasso Regression (L1正则化)
Q:正则化L1和L2有什么区别?
A:L1是w绝对值加和,L2是w平方加和。L1的有趣的现象是会使得w有的接近于0,有的接近于1,
L1更多的会用在降维上面,因为有的是0有的是1,我们也称之为稀疏编码。
L2是更常用的正则化手段,它会使得w整体变小

超参数alpha 在Rideg类里面就直接是L2正则的权重
超参数alpha 在Lasso类里面就直接是L1正则的权重
超参数alpha 在ElasticNet和SGDRegressor里面是损失函数里面的alpha
超参数l1_ration 在ElasticNet和SGDRegressor里面是损失函数的p

4.多项式回归

多项式回归:叫回归但并不是去做拟合的算法
PolynomialFeatures是来做预处理的,来转换我们的数据,把数据进行升维!

Q:升维有什么用?
A:升维就是增加更多的影响Y结果的因素,这样考虑的更全面,最终是要增加准确率!
还有时候,就像PolynomialFeatures去做升维,是为了让线性模型去拟合非线性的数据!

Q:PolynomialFeatures是怎么升维的?
A:可以传入degree超参数,如果等于2,那么就会在原有维度基础之上增加二阶的数据变化!
更高阶的以此类推

Q:如果数据是非线性的变化,但是就想用线性的模型去拟合这个非线性的数据,怎么办?
A:1,非线性的数据去找非线性的算法生成的模型去拟合
2,可以把非线性的数据进行变化,变成类似线性的变化,然后使用线性的模型去拟合
PolynomialFeatures类其实就是这里说的第二种方式

保险的案例:
目的:未来来个新的人,可以通过模型来预测他的医疗花销
所以,就把charges列作为y,其他列作为X维度

Q:为什么每行没有人名?
A:人名不会对最终的Y结果产生影响,所以可以不用

Q:为什么要观测注意数据多样性,采样要均匀?
A:就是因为你要的模型的功能是对任何年龄段的人都有一个好的预测,那么你的模型在训练的时候
读取的数据集,就得包含各个年龄段得数据,而且各个年龄段也得数据均匀,防止过拟合!

Q:什么是Pearson相关系数?
A:Pearson相关系数是来测量两组变量之间的线性相关性的!Pearson相关系数的区间范围是-1到1之间
如果越接近于-1,说明两组变量越负相关,一个变大,另一个变小,反之如果越接近于1,说明两组
变量越正相关,一个变大,另一个也跟着变大,如果越接近于0,说明越不相关,即一个变大或变小,
另一个没什么影响!
通过Pearson相关系数,如果发现两个维度之间,相关系数接近于1,可以把其中一个去掉,做到降维!
通过Pearson相关系数,如果发现某个维度和结果Y之间的相关系数接近于0,可以把这个维度去掉,降维!

5.代码演示

import numpy as np
from sklearn.linear_model import ElasticNet
from sklearn.linear_model import SGDRegressor

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

elastic_net = ElasticNet(alpha=0.0001, l1_ratio=0.15)
elastic_net.fit(X, y)
print(elastic_net.predict(1.5))

sgd_reg = SGDRegressor(penalty='elasticnet', n_iter=1000)
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

data = pd.read_csv('./insurance.csv')
print(type(data))
print(data.head())
print(data.tail())
# describe做简单的统计摘要
print(data.describe())

# 均匀采样
data_count = data['age'].value_counts()
print(data_count)
#多项式回归
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1)

plt.plot(X, y, 'b.')

d = {1: 'g-', 2: 'r+', 10: 'y*'}
for i in d:
    poly_features = PolynomialFeatures(degree=i, include_bias=False)
    X_poly = poly_features.fit_transform(X)
    print(X[0])
    print(X_poly[0])
    print(X_poly[:, 0])

    lin_reg = LinearRegression(fit_intercept=True)
    lin_reg.fit(X_poly, y)
    print(lin_reg.intercept_, lin_reg.coef_)

    y_predict = lin_reg.predict(X_poly)
    plt.plot(X_poly[:, 0], y_predict, d[i])

plt.show()

二、分类器项目案例

1.简单介绍

•一行行读入原始微博
•读的同时进行分词并存入语料库
•使用sklearn包中feature_extraction的方法计算出每条微博每个词中的tf-idf值•将计算出的微博向量矩阵带入到算法中去聚类
•将聚类结果和原始微博数据进行整合存入一个结果文件

2.代码演示

代码如下(示例):

import numpy as np
from sklearn import linear_model, datasets
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy import fft
from scipy.io import wavfile
from sklearn.linear_model import LogisticRegression
"""
使用logistic regression处理音乐数据,音乐数据训练样本的获得和使用快速傅里叶变换(FFT)预处理的方法
1. 把训练集扩大到每类100个首歌而不是之前的10首歌,类别仍然是六类:jazz,classical,country, pop, rock, metal
2. 同时使用logistic回归和KNN作为分类器
3. 引入一些评价的标准来比较Logistic和KNN在测试集上的表现 
"""

# 准备音乐数据
def create_fft(g, n):
    rad = "d:/genres/"+g+"/converted/"+g+"."+str(n).zfill(5)+".au.wav"
    sample_rate, X = wavfile.read(rad)
    fft_features = abs(fft(X)[:1000])
    sad = "d:/trainset/"+g+"."+str(n).zfill(5) + ".fft"
    np.save(sad, fft_features)
 
genre_list = ["classical", "jazz", "country", "pop", "rock", "metal"]
for g in genre_list:
    for n in range(100):
        create_fft(g, n)

# 加载训练集数据,分割训练集以及测试集,进行分类器的训练
# 构造训练集

genre_list = ["classical", "jazz", "country", "pop", "rock", "metal"]
X = []
Y = []
for g in genre_list:
    for n in range(100):
        rad = "d:/StudyMaterials/python/python-sklearn/trainset/"+g+"."+str(n).zfill(5)+ ".fft"+".npy"
        fft_features = np.load(rad)
        X.append(fft_features)
        Y.append(genre_list.index(g))

X = np.array(X)
Y = np.array(Y)
    
# 使用sklearn,来构造和训练两种分类器 

model = LogisticRegression()
model.fit(X, Y)
# predictYlogistic=map(lambda x:logclf.predict(x)[0],testX)

print('Starting read wavfile...')

sample_rate, test = wavfile.read("d:/StudyMaterials/python/python-sklearn/trainset/sample/heibao-wudizirong-remix.wav")
testdata_fft_features = abs(fft(test))[:1000]
print(sample_rate, testdata_fft_features, len(testdata_fft_features))
type_index = model.predict([testdata_fft_features])[0]
print(type_index)
print(genre_list[type_index])

标签:机器,回归,fft,学习,np,print,import,Week3,sklearn
来源: https://blog.csdn.net/m0_56969616/article/details/120689521

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有