袁同学学位论文需要,要做一个航空发动机相关的预测模型,了解需求后做了一下测试。
实现最简单的线性回归拟合。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cross_validation import train_test_split #这里是引用了交叉验证
设置文件路径
输出前五行
data = pd.read_csv('//Users//taorui//Desktop//C.csv')
print(data.head())
T PR C K4 K5 P
0 0.242762 1.10 1.3 0.872705 0.849261 111457.50
1 0.299574 1.15 1.3 0.819009 0.786949 116523.75
2 0.346813 1.20 1.3 0.770697 0.731578 121590.00
3 0.388138 1.25 1.3 0.727038 0.682132 126656.25
4 0.425288 1.30 1.3 0.687423 0.637777 131722.50
画出'PR', 'K4', 'K5', 'C', 'P'
和‘T’
的相关性图
用pandas包十分方便,x_vars是自变量,y_vars是因变量。
sns.pairplot(data, x_vars=['PR', 'K4', 'K5', 'C', 'P'], y_vars='T', size=7, aspect=0.8, kind='reg')
plt.show()
‘T’是目标变量,’PR’, ‘K4’, ‘K5’, ‘C’, ‘P’是特征变量。
# 创建特征变量x
feature_cols = ['PR', 'K4', 'K5', 'C', 'P']
X = data[feature_cols]
# 检查x的类型和形状
print(type(X))
print(X.shape)
# 创建目标变量y
y = data['T']
# 检查y
print(y.head())
<class 'pandas.core.frame.DataFrame'>
(68, 5)
0 0.242762
1 0.299574
2 0.346813
3 0.388138
4 0.425288
Name: T, dtype: float64
自变量是68*5的数据
训练集的大小为51行,测试集为17行
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
(51, 5)
(51,)
(17, 5)
(17,)
选择线性回归
# 导入线性回归模型
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
# 拟合模型
model = linreg.fit(X_train, y_train)
# 输出模型的常数项
print(linreg.intercept_)
# 输出模型的系数
print(linreg.coef_)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
-3.55187951698
[ 1.04770046e-10 1.42840361e+01 -1.23029610e+01 4.77227275e-01 1.05982031e-05]
常数项为-3.55187951698
,特征系数为:[ 1.04770046e-10 1.42840361e+01 -1.23029610e+01 4.77227275e-01 1.05982031e-05]
#输出特征变量的系数矩阵
print(list(zip(feature_cols, linreg.coef_)))
# 输出预测结果
y_pred = linreg.predict(X_test)
print(y_pred)
[('PR', 1.0477004584627557e-10), ('K4', 14.284036140465224), ('K5', -12.302961036637541), ('C', 0.47722727506729989), ('P', 1.059820310552371e-05)]
[ 0.44577646 0.17164983 0.58288693 0.26046797 0.51254283 0.35109938 0.67708651 0.54122192 0.2939984 0.36524462 0.26979917 0.12392711 0.37161395 0.51874202 0.63060966 0.4002806 0.60589296]
plt.figure()
# 画出模型的预测结果
plt.plot(range(len(y_pred)),y_pred,'b',label="predict")
# 画出测试集的真实值
plt.plot(range(len(y_pred)),y_test,'r',label="test")
# 图例的位置:右上角
plt.legend(loc="upper right")
# 设置横纵坐标
plt.xlabel("the number of sales")
plt.ylabel('value of sales')
# 画图
plt.show()
可以看到预测结果和实际情况基本吻合