-
实验概述import pandas as pd import matplotlib.pyplot as plt import numpy as np # 读取数据 train = pd.read_csv('train(1).csv') test = pd.read_csv('test(1).csv') print(train.shape) print(test.shape) # 查看数据类型和描述 print(train.info()) print(train.describe()) # 统计每列Null的占比 print((train.isnull().sum().sort_values(ascending=False)) / train.shape[0]) # 删除空值占比高的列 train.drop(columns=['PoolQC', 'MiscFeature', 'Alley', 'Fence'], axis=1, inplace=True) test.drop(columns=['PoolQC', 'MiscFeature', 'Alley', 'Fence'], axis=1, inplace=True) # 统计所有列中的数值类型和分类类型的列 # 不是数值类型的列 category_columns = [col for col in train.columns if train[col].dtype == 'object'] # 是数值类型的列 number_columns = [col for col in train.columns if train[col].dtype != 'object'] print(category_columns) print(number_columns) # 特征工程 train_nan_num = [] train_nan_cat = [] # 统计数值类型中哪些列有Null值 for col in number_columns: if (train[col].isnull().sum() > 0): train_nan_num.append(col) print(train_nan_num) # 统计不是数值类型的列哪些有空值 for col in category_columns: if (train[col].isnull().sum() > 0): train_nan_cat.append(col) print(train_nan_cat) # 删除售价的列 number_columns.remove('SalePrice') # 统计测试集中那些列包含NaN test_nan_num = [] test_nan_cat = [] # 统计数值类型的列哪些有空值 for col in number_columns: if (test[col].isnull().sum() > 0): test_nan_num.append(col) # 统计不是数值类型的列哪些有空值 for col in category_columns: if (test[col].isnull().sum() > 0): test_nan_cat.append(col) # 删除有空的列的数据,数据减少太多,换个方法 train_one = train.dropna(axis=0) print(train_one.shape) # 所有的数据值取中值,非数据值为None for col in train_nan_num: train[col].fillna(train[col].median(), inplace=True) for col in train_nan_cat: train[col].fillna('None', inplace=True) for col in test_nan_num: test[col].fillna(test[col].median(), inplace=True) for col in test_nan_cat: test[col].fillna('None', inplace=True) from sklearn.preprocessing import LabelEncoder LE = LabelEncoder() # 对所有非数值的列进行归一化 for col in category_columns: train[col] = LE.fit_transform(train[col]) test[col] = LE.fit_transform(test[col]) # pd.set_option('max_columns', 100) pd.options.display.max_columns = 100 print(train.head()) # 构造特征的数据集,id和售价列删除,转成二维数组 X = train.drop(columns=['Id', 'SalePrice'], axis=1).values print(X) # 目标集 y = train['SalePrice'].values # 转二维数组 # y = y.reshape(-1, 1) print(y) # 数据集划分 from sklearn.model_selection import train_test_split # 验证集占30%,打乱顺序 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, shuffle=True) print(X_train.shape) # 创建回归模型 from sklearn.linear_model import LinearRegression LR = LinearRegression() # 训练 LR.fit(X_train, y_train) # 预测 y_pred = LR.predict(X_test) # 查看均方误差 from sklearn.metrics import mean_squared_error print('MSE:', mean_squared_error(y_pred, y_test)) # 查看R2指标 from sklearn.metrics import r2_score r2 = r2_score(y_test, y_pred) print('R2:', r2) # 预测 test.drop(columns=['Id'], axis=1, inplace=True) lr_pred = LR.predict(test) print(lr_pred) test['SalePrice'] = lr_pred test.to_csv('test1.csv') print(range(len(y_test))) print(sorted(y_test)) plt.plot(range(len(y_test)), sorted(y_test), c='blue', label='y_true') plt.plot(range(len(y_pred)), sorted(y_pred), c='red', label='y_pred') plt.legend() plt.show()
- 实验目标和主要内容
实验目标: 掌握线性回归算法,能够通过线性回归的方法建立线性预测模型。
开发平台:PyCharm Community Edition 2021.3.2 x64
语言:Python
主要内容:
-
-
- 根据房屋指标及价格数据通过线性回归算法建立预测模型,预测房屋的价格。
-
- 实验设计
2.1关键算法分析
算法1:统计并删除空值占比高的列
代码:
算法2:统计数值类型和非数据类型
代码:
算法3:统计训练集测试集空值
代码:
算法4:删除售价列和空值列
代码:
算法5:补足空值
代码:
算法6:对非数值列进行归一化
代码:
算法7:构造特征的数据集
代码:
算法8:数据集划分
代码:
算法9:建立回归模型
代码:
算法10:检验模型
代码:
算法11:预测作图
代码:
- 程序运行结果分析
1. 线性回归模型的均方误差MSE和R2指标:
2. 使用线性回归模型,预测test.csv中的数据,求得的部分结果如下:
3. 对训练集的测试数据进行预测,画出图象,与实际值进行比较(其中,y_true为实际值,y_pred为测试值)。
图1训练集测试数据的实际值和测试值
- 总结
4.1 实验的难点和关键点
- 无用数据和空数据需要进行清洗,清洗后补足空缺;
- 对非数值数据要进行归一化处理;
- 线性回归算法的误差。
- 心得体会
- 学会了运用线性回归算法建立预测模型;
- 了解了线性回归模型的要点,数据预处理(清洗,归一化),模型误差等。