文章目录
非广告-推荐个git项目(代码+原理图解)
机器学习代码100天:https://github.com/Avik-Jain/100-Days-Of-ML-Code
机器学习代码100天-中文版:https://github.com/MLEveryday/100-Days-Of-ML-Code
参考
https://blog.csdn.net/pxhdky/article/details/82388964
概念
线性回归
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w’x+e,e为误差服从均值为0的正态分布。
回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
在机器学习中,线性回归是最简单的回归模型。
假设数据的特征值x与目标值y是有线性关系的,那么最主要的就是找到一条直线,能够拟合数据的分布,以便于我们根据一个新的特征值,得到的预测值与实际值的差最小。但是数据的分布一般都是不均匀的,所以我们的目标就转换为:找到一条直线,使这条线上的点到所有数据点的距离之和最小,即:应用最小二乘法,所以问题就转化为对最小二乘法的参数估计。
具体做法是分别对最小二乘法的参数求偏导,并使求导后的式子等于0,得到两个参数的最优闭式解。
对数线性回归
对数线性模型是在形式上仍为线性回归,但是实质上,已经是在求取输入空间到输出空间的非线性函数映射。参数的影响仍然是线性的,但是实际的预测值并不是线性变化的。这样可引入广义线性模型的概念,在线性模型的基础上,再引入一个联系函数,与线性模型相结合。所以,对数线性回归,就可以理解为,当广义线性模型的联系函数为对数函数时的一种情况。
对数几率回归
虽然名字叫作回归,但是对数几率回归并不是进行回归预测,而是分类。在做二分类任务的时候,期望的取值区间为0和1,不是这一种即是另一种。最理想的联系函数为单位阶跃函数,取值完全符合二分类任务的要求,但是单位阶跃函数不连续,故换而采用sigmod函数代替,取值区间仍然一样,但是在0到1的过度区相对平缓。
练习代码
构建模型–>训练模型–>预测
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
# 房屋面积与价格历史数据
data = np.array([[150, 6450], [200, 7450], [250, 8450], [300, 9450], [350, 11450], [400, 15450], [600, 18450]])
plt.scatter(data[:, 0], data[:, 1], color='blue')
# 构建线性模型(待训练模型) 结果由若干种影响因素线性叠加而来 ax+by+cz+...
regr = linear_model.LinearRegression()
# 拟合(训练模型)
regr.fit(data[:, 0].reshape(-1, 1), data[:, 1])
# 直线的斜率,截距
a, b = regr.coef_, regr.intercept_
plt.plot(data[:, 0], regr.predict(data[:, 0].reshape(-1, 1)), color='red')
# 预测第175天的放假数据(预测)
print(regr.predict(np.array([175, ]).reshape(-1, 1)))
plt.show()
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
def price_predict():
# 数据有三个特征:距离地铁距离、附近小学数量、小区绿化率
X = np.array([[500.0, 3.0, 0.3], [1000.0, 1.0, 0.6], [750.0, 2.0, 0.3], [600.0, 5.0, 0.2], [1200.0, 1.0, 0.6]])
# 具有三个特征的房屋对应的房价
Y = np.array([10000., 9000., 8000., 12000., 8500.])
std_x = StandardScaler()
x_train = std_x.fit_transform(X) # 翻译,对一组数据生成一组标准化模型
std_y = StandardScaler()
y_train = std_y.fit_transform(Y.reshape(-1, 1))
# 构建线性预测模型
lr = LinearRegression()
# 模型在历史数据上进行训练,Y.reshaoe(-1,1)将Y变为二维数组,fit函数要求二维数组
lr.fit(x_train, y_train)
# 使用训练模型预测新房屋[1300.0,3.0,0.4]的价格
x_predict = std_x.transform(np.array([[1300.0, 3.0, 0.4]]))
# 反翻译,将标准化数据转换成原始数据
print(std_y.inverse_transform(lr.predict(x_predict)))
load_boston 13维数据预测房价价格
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.externals import joblib
lb = load_boston()
x = lb.data
y = lb.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
lr = LinearRegression()
lr.fit(x_train, y_train)
# 保存训练好的模型
joblib.dump(lr, "./test.pkl")
# 预测测试集的房子价格
print(std_y.inverse_transform(y_test[9]))
y_lr_predict = std_y.inverse_transform(lr.predict(np.array([x_test[9]])))
print(y_lr_predict)
"""
# 从保存的模型中预测
model = joblib.load("./test.pkl")
y_predict = std_y.inverse_transform(model.predict(x_test))
print(y_predict)
模型评估方式
均方差
a = std_y.inverse_transform(y_test)
b = y_lr_predict
c = (np.array(a-b)**2).sum()/len(a)
print(c)
可释放差
a = std_y.inverse_transform(y_test)
b = y_lr_predict
c = 1 - np.array(a-b).var()/a.var()
print(c)
中值绝对误差
a = std_y.inverse_transform(y_test)
b = y_lr_predict
c = np.abs(a - b) # 取绝对值
d = np.median(c)
print(d)
R2决定系数(拟合优度)
模型越好:R2–> 1
a = std_y.inverse_transform(y_test)
b = y_lr_predict
c = r2_score(a,b) # r2_score(实际值, 预测值)
print(c)