首页 > 其他分享 >基于KNN的二手车价格预测简易项目✅

基于KNN的二手车价格预测简易项目✅

时间:2024-06-18 22:33:15浏览次数:11  
标签:KNN plt 简易 二手车 df train pd test import

目录

1. 加载数据

2.特征工程

(1)数据编码、清洗

(2)创建特征热力图 

(4)特征两两结合,观察相关性 

3.构建模型进行训练与评估

(1)构建模型并训练

(2)模型评估 


1. 加载数据

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
#读取数据
df = pd.read_csv('data.csv')

2.特征工程

(1)数据编码、清洗

# 独热编码颜色和类型
df_colors = pd.get_dummies(df['Color'], prefix='Color')
df_type = pd.get_dummies(df['Type'], prefix='Type')
df = pd.concat([df, df_colors, df_type], axis=1)
df = df.drop(['Brand', 'Color', 'Type'], axis=1)

# 数据清洗:删除含有缺失值的行
df = df.dropna()

# 特征工程:创建新特征
df['Year_Mileage_Ratio'] = (2024 - df['Construction Year']) / df['Odometer']

# 数据标准化
scaler = StandardScaler()
numerical_features = ['Construction Year', 'Odometer', 'Ask Price', 'Year_Mileage_Ratio']
df[numerical_features] = scaler.fit_transform(df[numerical_features])

(2)创建特征热力图 

# 设置matplotlib以使用中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号

# 特征热力图
plt.figure(figsize=(12, 10))
corr_matrix = df.corr()

# 替换这里的列名为中文
corr_matrix = corr_matrix.rename(columns={'Ask Price': '要价', 'Construction Year': '建造年份', 'Odometer': '里程表', 'Year_Mileage_Ratio': '年份里程比'}, inplace=False)
sns.heatmap(corr_matrix, annot=True, fmt=".2f", cmap='coolwarm', square=True)
plt.title('相关性热力图')
plt.show()

(4)特征两两结合,观察相关性 

# 特征两两组合,观察相关性
sns.pairplot( df[['Construction Year', 'Days Until MOT', 'Odometer', 'Ask Price']],size=2)
plt.show()

3.构建模型进行训练与评估

(1)构建模型并训练

from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#导入数据
df = pd.read_csv('D:/data.csv')
df_colors = pd.get_dummies(df['Color'], prefix='Color:')
df_type = pd.get_dummies(df['Type'].apply(str), prefix='Type:')
df = pd.concat([df, df_colors, df_type], axis=1)
df.drop(['Brand', 'Type', 'Color'], axis=1, inplace=True)
# 准备样本数据,选取'Construction Year', 'Days Until MOT', 'Odometer'这样个特征进行模型训练
X = df[['Construction Year', 'Days Until MOT', 'Odometer']]
y = df['Ask Price'].values.reshape(-1, 1)
# 生成训练及测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=41)
# 特征缩放--标准化
X_normalizer = StandardScaler()  # N(0,1)
X_train = X_normalizer.fit_transform(X_train)  # 对训练特征数据进行拟合并归一
X_test = X_normalizer.transform(X_test)  # 在对训练特征数据拟合之后应用到测试数据上
# 特征缩放--标准化(仅对特征X)  
X_normalizer = StandardScaler()  # N(0,1)  
X_train = X_normalizer.fit_transform(X_train)  # 对训练特征数据进行拟合并归一  
X_test = X_normalizer.transform(X_test)  # 在对训练特征数据拟合之后应用到测试数据上  
  
# 训练模型  
knn = KNeighborsRegressor(n_neighbors=2)  # 可以通过交叉验证来选择最佳的K值  
knn.fit(X_train, y_train)  # 不需要ravel(),因为y_train已经是一维数组  
  
# 预测价格  
y_pred = knn.predict(X_test)  
  
# 评估模型(可选)  
from sklearn.metrics import mean_squared_error, r2_score  
mse = mean_squared_error(y_test, y_pred)  
r2 = r2_score(y_test, y_pred)  
print(f'MSE: {mse}, R²: {r2}')  
  
# 画图  
plt.scatter(y_test, y_pred, alpha=0.5)  # 使用y_test作为x轴,以便更容易看到误差  
plt.xlabel('Real value')  
plt.ylabel('Prediction')  
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)  # 完美的预测线  
plt.title('Predicted vs Real Ask Price')  
plt.show()  

(2)模型评估 

KNeighborsRegressor(algorithm='auto',leaf_size=30,metric='minkowski',metric_params=None, n_jobs=None, n_neighbors=2, p=2, weights='uniform')
pred = knn.predict(X_test)
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_pred_inv, y_test_inv)
from sklearn.metrics import mean_squared_error
mean_squared_error(y_pred_inv, y_test_inv)
print(y_pred_inv)

运行结果:

array([1199., 1199.,  700.,  899.])

print(y_test_inv)

运行结果:

array([[1300.],

       [1650.],

       [ 650.],

       [ 799.]])

 

 

 

 

 

 

 

 

 

标签:KNN,plt,简易,二手车,df,train,pd,test,import
From: https://blog.csdn.net/weixin_49816293/article/details/139784494

相关文章

  • 机器学习--有监督学习--分类算法(KNN算法)
     使用场景:做分类的,比如银行想做客户分类,看看新的这个客户,他是高风险用户还是低风险用户。原理使用:可以用贝叶斯分类,决策树算法,还有KNN,本篇主要整理KNN。KNN原理:有N个样本点,对新纪录r,使用KNN进行分类,看它属于哪个分类。具体如下:1、先确定k值,不建议太大,一般采用交叉验证法决定,k......
  • Javaweb实现简易记事簿 jdbc实现Java连接数据库
    //注册-[]获取register的数据,从表单传过来将(账户,密码,用户名)上面的数据写入数据库中,用jdbc(插入)加载数据库驱动,连接数据库,发送SQL加载数据库有可能失败保险起见抛一个异常返回判断,如果注册成功则提醒用户注册成功,并且跳转到登录页面进行登录。如果注册失败则提醒用户注册失败,......
  • 机器学习算法 —— K近邻(KNN分类)
    ......
  • 更简易、高效的微软Edge-tts库实时详细的经验分享
    Edge-tts是一个利用微软AzureCognitiveServices的在线文本转语音服务的Python库。它允许开发者在Python代码中使用该服务,而无需安装MicrosoftEdge浏览器、Windows操作系统或使用API密钥。这个Edge-tts库通过调用微软Edge浏览器的文本朗读相关API实现文本转......
  • Javaweb实现简易记事簿 jdbc实现Java连接数据库
    //相关代码packageUserAct;importjakarta.servlet.;importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.;importjava.io.;importjava.sql.;//登出@WebServlet("/UserAct.DeleteEvent")publicclassDeleteEventimplementsServlet{......
  • 机器学习初体验:KNN算法与鸢尾花的浪漫邂逅
    ......
  • 【python】用panda3d实现简易版《Minecraft》
    1.下載panda3d等等     panda3d是python的一个第三方库,在Windows的cmd下输入即可下載:pipinstallpanda3d     另外还用了 PIL,Pmw,ttkbootstrap這些第三方库,下載方式同上。。。2.方块模型     对于建模小白来说,blender有亿点难!! (资源放......
  • 基于STM32的简易智能家居设计(嘉立创支持)
    一、项目功能概述1、OLED显示温湿度、空气质量,并可以设置报警阈值2、设置4个继电器开关,分别控制灯、空调、开关、风扇3、设计一个离线语音识别系统,可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上4、OLED实时显示4个继电器的状态5、设计一个低功耗开关电路,......
  • 联系人管理系统(简易版)
    1、项目介绍    本项目以sqlite3为基本框架完成一个简易的手机联系人管理系统,用户可以根据自己需要进行添加联系人、删除联系人、更新联系人、查找联系人以及退出等。2、本项目涉及到的sqlite3API①sqlite3_open()函数用于打开一个SQLite数据库文件的函数,这个函......
  • 【近邻算法】近邻算法详解——深入理解K-近邻(KNN)
    目录1引言2算法基础2.1核心原理2.2算法步骤3关键参数与优化3.1K值选择3.2距离度量4优缺点分析4.1优点4.2缺点5改进策略6应用案例深度解析:K-近邻算法在客户细分中的应用6.1引言6.2数据准备与预处理6.3特征选择与编码6.4K-近邻算法应用6.5模型......