【自然语言处理入门】03:利用线性回归对数据集进行分析预测(下)

来源:互联网 发布:青岛衣知她有限公司 编辑:程序博客网 时间:2024/06/05 11:50

上一篇中我们简单的介绍了利用线性回归分析并预测波士顿房价数据集,那么在这一篇中,将使用相同的模型来对红酒数据集进行分析。

1 基本要求

利用线性回归,对红酒数据集进行分析。数据集下载地址。

2 完整代码

#-*- coding: UTF-8 -*-# @Time    : 2017/12/21 9:29# @Author  : xiongzongyang# @Software: PyCharmimport pandas as pdfrom pandas import Series, DataFrameimport numpy as npfrom sklearn.linear_model import LinearRegression #线性回归from sklearn.metrics import mean_squared_errorimport matplotlib as mplimport matplotlib.pyplot as plt#读取数据def read_data(data_path="./data/"):    test_data = pd.read_csv(data_path+"test.csv", header=None)    train_data = pd.read_csv(data_path+"train.csv", header=None)    return train_data,test_data#数据处理def deal_data(pd_data):    #获取数据的行数,因为要出去字段名,所以要-1    row_cnt = pd_data.shape[0]-1    #计算列数,因为在读入数据时,没有指定分隔符,所以所有列数据都是作为一列数据来读入的,因此在计算列数时,将读入的每一行按照;来分开    column_cnt = len(pd_data.iloc[0, 0].split(";"))    #empty 会创建一个没有使用特定值来初始化的数组。给这些方法传递一个元组作为形状来创建高维数组:    X = np.empty((row_cnt, column_cnt - 1))    Y = np.empty((row_cnt, 1))    column_name=pd_data.iloc[0, 0].split(";")    #开始获取数据    for i in range(0, row_cnt):        #逐一将每一行进行分割(按;空格分割)        row_array = pd_data.iloc[i+1, 0].split(";")        #x取前13个数据,X[i]是一个一维数组,则X相当于一个二维数组,Y同理        X[i] = np.array(row_array[0:-1])        #y取最后一个数据        Y[i] = np.array(row_array[-1])    return X, Y,column_name#把特征标准化为均匀分布def uniform_norm(X):    X_max = X.max(axis=0)    X_min = X.min(axis=0)    return (X - X_min) / (X_max - X_min), X_max, X_min#实现线性回归#画图def draw(pred,test_Y):    t = np.arange(len(pred))    mpl.rcParams['font.sans-serif'] = [u'simHei']    mpl.rcParams['axes.unicode_minus'] = False    plt.figure(facecolor='w')    plt.plot(t, test_Y, 'r-', lw=2, label=u'true value')    plt.plot(t, pred, 'b-', lw=2, label=u'estimated')    plt.legend(loc='best')    plt.title(u'wine quality', fontsize=18)    plt.xlabel(u'case id', fontsize=15)    plt.ylabel(u'quality', fontsize=15)    plt.grid()    plt.show()#模型评估def evaluate(unif_train_X,train_Y,unif_test_X,test_Y):    print("训练集上效果评估:")    pred_train = model.predict(unif_train_X)    print("R^2系数 ", model.score(unif_train_X, train_Y))    print("均方误差 ", mean_squared_error(train_Y, pred_train))    print("\n测试集上效果评估 :")    r2 = model.score(unif_test_X, test_Y)    print("R^2系数 ", r2)    pred = model.predict(unif_test_X)    print("均方误差 ", mean_squared_error(test_Y, pred))#主函数if __name__ == "__main__":    #读取数据    train_data,test_data=read_data()    #数据处理    train_X, train_Y,column_name=deal_data(train_data)    # print(train_X.shape)    # print(train_Y.shape)    test_X, test_Y,column_name=deal_data(test_data)    # print(test_X.shape)    # print(test_Y.shape)    #把特征标准化为均匀分布    unif_train_X, max_X, min_X = uniform_norm(train_X)    unif_test_X = (test_X - min_X) / (max_X - min_X)    #实现线性回归    model = LinearRegression()    model.fit(unif_train_X, train_Y)    #在训练集上预测    pred_train = model.predict(unif_train_X)    #在测试集上预测    pred = model.predict(unif_test_X)    #画图    draw(pred,test_Y)    #模型评估    evaluate(unif_train_X,train_Y,unif_test_X,test_Y)

注意:本数据集中,每一列都有列名,因此在数据预处理的过程中要去掉。

3 实验结果

image

4 实验小结

结果这两个实验可以看出,一般数据分析处理流程如下图所示。

graph LR数据读取-->数据预处理选择模型-->训练模型数据预处理-->训练模型训练模型-->测试模型测试模型-->模型评估
阅读全文
0 0