文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、逻辑回归
多元线性回归(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 = (-ylogP + -(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])