#载入加州住房房价数据集导入工具from sklearn.datasets import fetch_california_housing#将数据导入housing = fetch_california_housing()#查看数据的键名housing.keys()
运行结果:
dict_keys(['data', 'target', 'frame', 'target_names', 'feature_names', 'DESCR'])
从运行结果可以看出,数据集中存储了5个键,这里我们重点关注target(房屋的售价)及feature_names(房屋的特征)。
也就是说,我们需要训练模型,让它学习房屋特征和售价的关系,并且可以自动预测出新房屋的售价。
下面来看一下数据中存储的特征都有哪些
输入代码如下:
#查看样本的特征名称housing.feature_names
运行结果:
['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
从代码运行结果可以看到,程序返回了样本全部的特征名称,共计7个。
因为这里只是进行回归分析的演示,所以不展开讲解这些特征具体代表什么。感兴趣的读者可以自行查看scikit-learn官方文件进行深入了解。
如果朋友希望继续了解房屋的价格是什么样子,可以使用下面这行代码来查看一下:
#取前十套房屋查看售价housing.target[:10]
运行结果:
array([4.526, 3.585, 3.521, 3.413, 3.422, 2.697, 2.992, 2.414, 2.267, 2.611])
接下来重复进行类似分类任务中的步骤,将数据集拆分为训练集和验证集。
2.拆分数据集并训练模型
为了防止新手运行错误,我把前面的全部加上来,如果是相对熟悉的朋友应该都之前,前面前面7行可以不用写。
#将样本特征和售价赋值给X,yX,y= housing.data, housing.target#使用train_test_split拆分为训练集和验证集X_train,X_test,y_train, y_test =\train_test_split(X, y)#查看拆分的结果X_train.shape
运行结果:
(15480, 8)
如果朋友也得到了这个结果,就说明你的数据集拆分成功。
下面开始模型的训练,输入代码如下:#导入KNN回归算法from sklearn.neighbors import KNeighborsRegressor#创建一个实例,参数保持默认设置knn_reg = KNeighborsRegressor()#拟合训练集数据knn_reg.fit(X_train, y_train)#查看模型在训练集和验证集的性能表print('训练集准确率:%.2f'%knn_reg.score(X_train, y_train))print('验证集准确率:%.2f'%knn_reg.score (X_test, y_test))
运行结果:
训练集准确率:0.45 验证集准确率:0.15
从运行结果可以明显看到:缺省参数的KNN回归模型在该数据集中的性能表现差强人意,在训练集中的准确率只有45%,而在验证集中则更加糟糕,只有15%。这说明模型出现了欠拟合的问题,我们需要对数据集进行处理,或者对模型进行调优。
3.模型评估的不同方法和改进
相信朋友们和西西一样,发现了这样一个事情:
(这些理论要是暂时看不懂,或者理解不了,不要紧,只需要把后面的结论记下来,1+1为什么等于2不要紧,只需要记住1+1=2就行。)
不论是在分类模型中,还是回归模型中,我们都使用了.score()方法来评估模型的性能。然而,在两种模型中,score()方法所进行的计算是不一样的。在分类模型中,.score()返回的是模型预测的准确率(accuracy),其计算公式为
在上面这个公式中,TP(True Positive)表示模型预测正确的正样本数量;TN(TrueNegative)表示模型预测正确的负样本数量;FP(False Positive)表示原本是负样本,却被模型预测为正样本的数量,也就是我们平时说的“假阳性”;FN(False Negative)表示原本是正样本,却被模型预测为负样本的数量,也就是“假阴性"。TP、FP、TN、FN的和就是所有的样本数量。也就是说,分类模型的准确率是模型预测正确的样本数量,除以全部参与预测的样本数量。当然,除了准确率之外,我们还可以用Precision、Recall、F1 score等方法来对分类模型进行性能评估,这里暂时不展开讲解。
(后面就是必须要记住的结论了记住。)
西西尝试对KNN回归的参数进行调整,看是否可以改进模型的性能。与分类模型一样,我们先使用网格搜索来寻找模型的最优参数。输入代码如下:
# 定义参数范围n_neighbors = tuple(range(1, 21, 1))# 创建网格搜索实例cv_reg = GridSearchCV(estimator=KNeighborsRegressor(), param_grid={'n_neighbors': n_neighbors}, cv=5)# 使用网格搜索拟合训练数据cv_reg.fit(X_train, y_train){'n_neighbors': 9}
ennnnn,结果让我一度绝望。
朋友们如果没有理解错误,获取了最优参数9,我们就需要把这个带入模型进行验证。
西西不演示结果了,结果让人非常绝望。
侧面说明了这两年经济形势很复杂。可以做反向指标。
理论就讲完了,下期,我们将把KNN分类和回归模型用于股市,看一下是否适用。
Copyright © 2024-2025 成都宁时科技有限公司 版权所有