相关性
相关性系数-1到1,正数是正相关,负数是负相关,数越大相关性越强,相关系数为1,表示两个数据成线性关系,0表示完全不相关,负数表示相反。
SVD的提法 奇异值分解
机器学习模型:线性回归/逻辑回归
y:
离散:分类
连续:回归
截距:就是我们选取的特征值进行各种加权平均,进行拟合之后,都无法拟合y值,从而造成的一个偏移量 。整体性的系统偏移,叫做截距
方差:即偏离程度。方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数
针对具体的数据如何选择合适的预处理方式?
根据经验
多种误差怎么判断拟合效果?
回归:MSE,MAE,误差平方和
分类:精确度,正确率,召回率
安装 机器学习的包: pip install scikit-learn
在建模的过程中,刚开始虽然建模错了,但是模型在学习过程中,会自动的进行分析,让其不那么错。
如图所示:当使用线性函数去表示二次函数的时候,使其斜率不变向下平移,得到该截距。
线性回归的代码实现
- data_generator2.py : 生成数据
import os
import cv2
import numpy as np
import pandas as pd
from PIL import Image
import matplotlib.pyplot as plt
if __name__ == '__main__':
d = np.random.random((1000, 5))
print(d)
data = pd.DataFrame(d, index=np.arange(2021, 2021-d.shape[0], -1), columns=list('东南西北中'))
data['Y'] = data['东']**2 - 3*data['南'] + 4*data['西'] - 6*data['北']
data['Y'] += np.random.random(d.shape[0])*0.2
print(data)
data.to_excel('result.xls', sheet_name='DATA', index=True)
- linear_regression_intro.py
from sklearn.linear_model import LinearRegression
# 对数据进行预处理
from sklearn.preprocessing import PolynomialFeatures, StandardScaler, MinMaxScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
import pandas as pd
import numpy as np
# 线性回归
if __name__ == '__main__':
# 使得输出的数字为小数的形式
np.set_printoptions(suppress=True)
# 读取result.xls文件
data = pd.read_excel('result.xls')
print(data)
# # 第一种方式:设置x
# data['东2'] = data['东'] ** 2
# data['南2'] = data['南'] ** 2
# data['西2'] = data['西'] ** 2
# data['北2'] = data['北'] ** 2
# data['中2'] = data['中'] ** 2
# x = data[['东2', '南2', '西2', '北2', '中2', '东', '南', '西', '北', '中']]
# # 第二种方式设置X
# pf = PolynomialFeatures(degree=2) # 对多项式值进行一个2次的生成,预处理。就不用自己输入各种格式了
# t = pf.fit_transform(data[['东', '南', '西', '北', '中']])
# # 将设置x,以及创建模型,合并到一个管道中去
model = Pipeline(
[('poly', PolynomialFeatures(degree=2)),
# ('pca', PCA(n_components=10)),
('linear_regression', LinearRegression())]
)
x = data[['东', '南', '西', '北', '中']]
y = data['Y']
print(y)
# 使用线性回归模型
# model = LinearRegression()
# 使用fit()输入训练数据,线性回归的所有理论,fit()函数全部实现了
model.fit(x, y)
linear_regression = model.get_params()['linear_regression']
# 线性回归的方程式的系数和对应的截距
print('系数:', linear_regression.coef_)
print('截距:', linear_regression.intercept_)
# 模型的预测值
y_pred = model.predict(x)
print(y_pred)
# 衡量模型好坏的度量
print('误差平方和SSE:', np.sum((y - y_pred) ** 2))
# 均方误差:越小,模型越好
print('MSE:', np.mean((y - y_pred) ** 2))
# print('MSE(System): ', mean_squared_error(y, y_pred))
print('MAE:', np.mean(np.abs(y - y_pred)))
# print('MAE:(System) ', mean_absolute_error(y, y_pred))
线性回归理论
损失函数(目标函数)
特征值
权重
方差
交叉验证
解析式的求解过程
选最优的,使用交叉验证,直接调用一个函数即可。
最优解都已经知道了,那机器学习算法中是不是不需要梯度下降法逐步学习参数吗?
还是需要梯度下降,进行降维的。当维度在百维之内,可以直接算(直接算的方法就是:参数解析式公式,如上所示)。如果维度是千万维,则需要进行梯度下降。
求模型,需要求θ,求θ需要求超参数λ。。。。。
进行交叉验证的代码
# coding: utf-8
# @Time: 2021/1/8 20:11
# @Author: zou wei
# @File: linear_regression_intro.py
# @Contact: visio@163.com
# @Software: PyCharm
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures, StandardScaler, MinMaxScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
import pandas as pd
import numpy as np
from sklearn.linear_model import Ridge, Lasso
from sklearn.linear_model import LogisticRegression, Ridge
from sklearn.model_selection import GridSearchCV, train_test_split
if __name__ == '__main__':
np.set_printoptions(suppress=True)
data = pd.read_excel('result.xls')
print(data)
data['东2'] = data['东'] ** 2
data['南2'] = data['南'] ** 2
data['西2'] = data['西'] ** 2
data['北2'] = data['北'] ** 2
data['中2'] = data['中'] ** 2
x = data[['东2', '南2', '西2', '南', '西', '北']
y = data['Y']
# 将数据分成训练集,测试集,test_size=0.2占百分之20。random_state要赋任意一个值,保证随机数相同。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
ridge = Ridge()
# 对超参数进行交叉验证,cv=3进行3折交叉验证,超参数λ取值:np.logspaces(-4,4,20),表示取10的-4次方到10的4次方中取20个数
model = GridSearchCV(ridge, param_grid={'alpha': np.logspace(-4, 4, 20)}, cv=3)
model.fit(x_train, y_train)
print('最优参数:', model.best_params_)
print('系数:', model.best_estimator_.coef_)
print('截距:', model.best_estimator_.intercept_)
# 预测值
y_train_pred = model.predict(x_train)
# print('SSE:', np.sum((y - y_pred) ** 2))
# print('MSE:', np.mean((y - y_pred) ** 2))
print('训练集MSE: ', mean_squared_error(y_train, y_train_pred))
# print('MAE:', np.mean(np.abs(y - y_pred)))
print('训练集MAE: ', mean_absolute_error(y_train, y_train_pred))
y_test_pred = model.predict(x_test)
print('测试集MSE: ', mean_squared_error(y_test, y_test_pred))
print('测试集MAE: ', mean_absolute_error(y_test, y_test_pred))
梯度下降算法
梯度下降算法:批量梯度下降算法,随机梯度下降算法
随机梯度下降算法:1个样本进行随机梯度下降,折中梯度下降
梯度下降算法是我们进行求解得到损失函数最小值的最直接的一个办法
代码实现
import numpy as np
import matplotlib.pyplot as plt
import math
if __name__ == '__main__':
x = np.linspace(0,1,100)
y = x ** x
plt.plot(x, y ,'r-',lw = 3)
plt.show()
# 初值,自己取
x = 1
# 超参数(学习率),自己写一个值
learning = 0.1
# 迭代,求x的最小值
for i in range(2000):
x = x - learning * (math.log(x) + 1) * x ** x
print(i,x)
神经网络使用随机梯度下降算法,参数batch_size表示选取几个样本,epochs:表示使用几轮
机器学习:逻辑回归模型
逻辑回归是进行分类的
线性回归所用到的知识点,梯度下降算法,正则项,最大似然函数等都能够迁移到逻辑回归中去。