对于数据科学家来说,处理丢失的数据是数据清理和模型开发过程中的一个重要部分 。通常情况下,真实数据包含多个稀疏字段或包含错误值的字段 。在这篇文章中,我们将讨论如何建立可以用来填补数据中缺失或错误值的模型 。
出于我们的目的,我们将使用可以在这里找到的葡萄酒数据集:https://www.kaggle.com/zynicide/wine-reviews
import pandas as pddf = pd.read_csv("winemag-data-130k-v2.csv")
接下来,让我们输出前五行数据:
print(df.head())
文章插图
文章插图
让我们从这些数据中随机抽取500条记录 。这将有助于加快模型训练和测试,尽管读者可以很容易地对其进行修改:
import pandas as pddf = pd.read_csv("winemag-data-130k-v2.csv").sample(n=500, random_state = 42)
现在,让我们打印与数据对应的信息,这将使我们了解哪些列缺少值:print(df.info())
文章插图
有几个列的非空值小于500,这与缺少的值相对应 。首先,让我们考虑建立一个模型,用“points”来估算缺失的“price”值 。首先,让我们打印“price”和“points”之间的相关性:
print("Correlation: ", df['points'].corr(df['price']))
文章插图
我们看到了一个微弱的正相关 。让我们建立一个线性回归模型,用“points”来预测“price” 。首先,让我们从“scikit learn”导入“LinearRegresssion”模块:
from sklearn.linear_model import LinearRegression
现在,让我们为训练和测试拆分数据 。我们希望能够预测缺失值,但我们应该使用真实值“price”来验证我们的预测 。让我们通过只选择正价格值来筛选缺少的值:import numpy as np df_filter = df[df['price'] > 0].copy()
我们还可以初始化用于存储预测和实际值的列表:y_pred = []y_true = []
我们将使用K-fold交叉验证来验证我们的模型 。让我们从“scikit learn”导入“KFolds”模块 。我们将使用10折来验证我们的模型:from sklearn.model_selection import KFoldkf = KFold(n_splits=10, random_state = 42)for train_index, test_index in kf.split(df_filter):df_test = df_filter.iloc[test_index]df_train = df_filter.iloc[train_index]
我们现在可以定义我们的输入和输出:for train_index, test_index in kf.split(df_filter):...X_train = np.array(df_train['points']).reshape(-1, 1)y_train = np.array(df_train['price']).reshape(-1, 1)X_test = np.array(df_test['points']).reshape(-1, 1)y_test = np.array(df_test['price']).reshape(-1, 1)
并拟合我们的线性回归模型:for train_index, test_index in kf.split(df_filter):...model = LinearRegression()model.fit(X_train, y_train)
现在让我们生成并存储我们的预测:for train_index, test_index in kf.split(df_filter):...y_pred.Append(model.predict(X_test)[0])y_true.append(y_test[0])
现在让我们评估一下模型的性能 。让我们用均方误差来评估模型的性能:print("Mean Square Error: ", mean_squared_error(y_true, y_pred))
文章插图
并不太好 。我们可以通过训练平均价格加上一个标准差来改善这一点:
df_filter = df[df['price'] <= df['price'].mean() + df['price'].std() ].copy()...print("Mean Square Error: ", mean_squared_error(y_true, y_pred))
文章插图
虽然这大大提高了性能,但其代价是无法准确估算葡萄酒的price 。与使用单一特征的回归模型预测价格不同,我们可以使用树基模型,例如随机森林模型,它可以处理类别和数值变量 。
让我们建立一个随机森林回归模型,使用“country”、“province”、“variety”、“winery”和“points”来预测葡萄酒的“price” 。首先,让我们将分类变量转换为可由随机森林模型处理的分类代码:
df['country_cat'] = df['country'].astype('category')df['country_cat'] = df['country_cat'].cat.codesdf['province_cat'] = df['province'].astype('category')df['province_cat'] = df['province_cat'].cat.codesdf['winery_cat'] = df['winery'].astype('category')df['winery_cat'] = df['winery_cat'].cat.codesdf['variety_cat'] = df['variety'].astype('category')df['variety_cat'] = df['variety_cat'].cat.codes
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- python语言-数据库查询数组转Dataframe格式
- 使用腹肌轮能减肥吗?
- 安装使用Hoppscotch构建API请求访问与测试
- 用Python抓取小说目录和全文
- python 操作PDF的几种方法
- 指定扫描目标和主机发现 Nmap使用详解
- 你知道黑客最喜欢使用的编程语言吗
- python随机生成100道100以内的加法试卷
- 用Python开发一个交互式网络和IP地址计算器
- 汇编语言的使用领域