预测鲍鱼年龄
前言
线性回归是监督学习的一个方向,用来预测连续的数值型数据。比如房价预测、销量预测等等。
- 优点:计算简单,易于理解
- 缺点:只使用与线性数据,对于非线性数据使用非线性回归模型
- 使用条件:连续的数值型数据
实战:预测鲍鱼年龄
1.数据源
本文使用的数据源是从UCI数据库中获取。UCI数据库是个常用的标准测试数据库。
下载地址:https://archive.ics.uci.edu/ml/datasets/Abalone
点击 Data Folder 进行下载
其中abalone.data是数据源,abalone.names是对数据的解释说明,包含列名、含义等等。可使用记事本打开。这里将其转为.txt格式
2.数据处理
1.读取数据
# 引包
[1]:import pandas as pd
import numpy as np
# 读取数据
[2]:data = pd.read_table("abalone.txt",sep=",",header=None)
data.columns = ["Sex","Length","Diameter continuous","Height","Whole weight","Shucked weight","Viscera weight","Shell weight","Rings"]
data.head()
2. 数据处理
对性别转为数值类型,“M”为1,“F”为-1,“|”为0
# 对性别转为数值类型,“M”为1,“F”为-1,“|”为0
[4]:def tran(x):
if x == "M":
return 1
elif x == "F":
return -1
else:
return 0
[5]:data.Sex = data.Sex.apply(tran)
[6]:data.shape
[6]:(4177, 9)
3.建模
1.引包
# 将数据矩阵随机划分训练集和测试集
from sklearn.model_selection import train_test_split
# 线性回归模型
from sklearn.linear_model import LinearRegression
# 画图
import plotly
import plotly.graph_objs as go
# 评估模型准确率
from sklearn import metrics
2.查看数据
这里使用三个属性来初步查看数据
fig1 = go.Scatter3d(x=data['Length'],
y=data['Height'],
z=data['Whole weight'],
marker=dict(opacity=0.9,
reversescale=True,
colorscale='Blues',
size=5),
line=dict (width=0.02),
mode='markers')
mylayout = go.Layout(scene=dict(xaxis=dict( title="curb-weight"),
yaxis=dict( title="horsepower"),
zaxis=dict(title="price")),)
plotly.offline.plot({"data": [fig1],
"layout": mylayout},
auto_open=True,
filename=("3DPlot.html"))
3.建模
# 划分训练集和数据集
[8]:X_train,X_test,Y_train,Y_test = train_test_split(data.iloc[:,0:-1],data.iloc[:,-1],test_size=0.3,random_state=10)
X_train.shape
[8]:(2923, 8)
# 建模
[9]:model = LinearRegression()
model.fit(X_train,Y_train)
[10]:predict_result = model.predict(X_test)
4.结果对比
拿实际数据的结果前五个和预测结果前五个进行对比:
[11]:predict_result[:5]
[11]:array([ 7.8554181 , 10.87956598, 9.89345623, 6.64893993, 8.99769228])
[12]:Y_test[:5].values
[12]:array([ 7, 10, 8, 9, 10], dtype=int64)
5.模型评估
这里分别使用回归评估指标MSE(均方误差),RMSE(均方根误差),R-Squared(准确度)来进行评估。
[13]:mse = metrics.mean_squared_error(Y_test,predict_result)
mse
[13]:4.926650489974809
[14]:rmse = np.sqrt(mse)
rmse
[14]:2.2196059312352743
[15]:r2 = metrics.r2_score(Y_test,predict_result)
r2
[15]:0.5298367786705702
4.总结
可以看出模型质量并不高,并不能达到我们想要的预测结果。所以该数据源不能使用简单的线性回归模型来进行预测。本文只是对sklearn中的线性回归模型通过实例进行使用说明。以后可以使用加权线性回归进行处理。