基于H2O AutoML与集成学习策略的房屋售价预测模型研究与实现

news2025/3/11 3:09:22

项目简述:

本项目采用H2O AutoML工具,针对加州房屋销售价格预测问题进行了深入研究与建模。项目以Kaggle提供的加州房屋
交易数据集为基础,通过数据清洗、特征工程、模型训练与评估等步骤,构建了一种基于集成学习策略的房价预测模型。该模型特别关注了异常值检测与处理、缺失值填充、数据类型转换、变量重要性筛选以及特征选择等多个关键环节,并运用统计学方法对数值型特征进行归一化处理,旨在提高模型泛化能力和预测精度。

步骤概述:

数据导入与初步探索:

首先导入所需库文件(如numpy、pandas等),加载训练集与测试集数据,并对原始数据的基本结构与大小进行检查。

数据清理:

离群点识别与剔除:

通过绘制“出售价格”与各相关特征(如“挂牌价”、“税估价值”、“年税收额”、“上次出售价格”)之间的散点图,发现并移除明显偏离正常分布的离群点。

特征处理:

对“卧室数”列进行特殊处理,将包含特定描述的条目转化为纯数字形式;同时将“邮编”列转换为字符串类型,以便后续分析。

缺失值处理:

统计并展示数据集中各列缺失值情况,依据缺失值数量与性质,分别采用零值填充、最大值填充、‘None’填充及众数填充等方法对缺失值进行有效填补。

数据转换与预处理:

目标变量调整:

对目标变量“出售价格”进行对数变换,以减小其偏斜程度,便于模型训练。

特征分布校正:

计算数值型特征的偏度,识别并记录高偏度特征。随后,对这些特征应用Box-Cox变换进行校正,降低其偏斜程度,提升模型性能。

异常值修正:

对于某些特征(如“车库车位数”、“总车位数”),设定阈值,确保其值大于零,避免引入不合理信息。

特征选择与模型训练:

特征筛选:

根据变量重要性指标,从所有特征中选取部分具有较高预测价值的特征用于模型构建。

模型搭建与训练:

利用H2O框架初始化并配置AutoML任务,指定最大模型数量、算法类型(仅限XGBoost)、最大运行时间、停止准则(RMSLE)及排序标准(RMSLE)。然后在预处理后的训练集上训练AutoML模型。

模型融合与预测:

集成预测:

鉴于单个模型可能存在过拟合现象,本项目采取前k个最优模型输出平均值的方式进行集成预测,以期降低方差、提高整体预测性能。

结果提交:

将集成预测结果保存至符合竞赛要求的CSV文件格式,准备提交至Kaggle平台进行评分。

实现代码

导入必要类库

import numpy as np # 用于线性代数的numpy库
import pandas as pd # 用于数据处理和CSV文件读写的pandas库

# 输入数据文件可用在只读的“../input/”目录中
# 例如,运行这行代码(通过点击运行或按Shift+Enter)将列出“input”目录下的所有文件

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename)) # 打印输入目录下所有文件的路径

# 您可以在当前目录(/kaggle/working/)中写入最多20GB的数据,这些数据在使用“Save & Run All”创建版本时将作为输出保留
# 您还可以将临时文件写入/kaggle/temp/,但它们不会在当前会话之外被保存
# 导入plotly的几个模块用于数据可视化
import plotly.express as px  # plotly.express简化了创建交互式图表的过程
import plotly.graph_objects as go  # plotly.graph_objects允许创建并自定义各种交互式图表
import plotly.figure_factory as ff  # plotly.figure_factory提供了一些工具来创建自定义的图表
from plotly.subplots import make_subplots  # plotly.subplots用于创建包含多个子图的图

# 导入matplotlib.pyplot用于对比或者结合matplotlib的特性进行可视化
import matplotlib.pyplot as plt

# 导入pandas_profiling用于数据探查和生成报告
from pandas_profiling import ProfileReport

# 导入seaborn用于美化matplotlib的图表以及更高级的统计可视化
import seaborn as sns

# 导入scikit-learn的metrics模块用于评估模型性能
from sklearn import metrics

# 导入scipy的stats模块用于统计分析
from scipy import stats

# 导入copy的deepcopy用于创建对象的深拷贝
from copy import deepcopy

# 导入h2o框架用于处理大规模数据以及建模
import h2o

这段代码主要目的是导入数据处理、可视化和建模所需的Python库。这些库包括Plotly用于交互式图表制作,PandasProfiling用于数据概况生成,Seaborn用于美观的统计图表,Scikit-Learn用于模型评估,Scipy用于统计分析,以及H2O用于大规模数据处理和建模。

1. 数据清洗

导入并观察数据

从指定路径读取加利福尼亚州房屋价格的训练集和测试集CSV文件。

train_df = pd.read_csv('/kaggle/input/california-house-prices/train.csv')
test_df = pd.read_csv('/kaggle/input/california-house-prices/test.csv')

# 输出训练集和测试集的数据形状
train_df.shape, test_df.shape

((47439, 41), (31626, 40))

根据以下散点图,删除离群点

从train_df数据框中删除指定的行索引

train_df=train_df.drop([3674,6055,32867,34876,43398,44091,44633])

将训练集中的‘Sold Price’(成交价格)和‘Listed Price’(挂牌价格)列合并,
并使用Plotly Express库绘制散点图。

data = pd.concat([train_df['Sold Price'], train_df['Listed Price']], axis=1)  # 合并成交价格和挂牌价格列

# 使用Plotly Express绘制散点图,比较挂牌价格与成交价格
fig = px.scatter(data, x='Listed Price', y='Sold Price')
fig.show()  # 展示散点图

将训练集中的“Sold Price”(成交价格)和“Tax assessed value”(税收评估值)两列合并,
并创建一个散点图来展示这两个变量之间的关系。

import pandas as pd
import plotly.express as px

# 合并两列数据
data = pd.concat([train_df['Sold Price'], train_df['Tax assessed value']], axis=1)

# 创建并显示散点图
fig = px.scatter(data, x='Tax assessed value', y='Sold Price')
fig.show()

将训练集中的“成交价格”和“年税金额”两列合并,并绘制散点图。

import pandas as pd
import plotly.express as px

# 合并数据列
data = pd.concat([train_df['Sold Price'], train_df['Annual tax amount']], axis=1)

# 绘制散点图
fig = px.scatter(data, x='Annual tax amount', y='Sold Price')
fig.show()

将训练集中的“成交价格”和“最近成交价格”列合并,并以散点图的形式展示这两个价格之间的关系。

import pandas as pd
import plotly.express as px

# 将“成交价格”和“最近成交价格”列合并为一个新的数据帧
data = pd.concat([train_df['Sold Price'], train_df['Last Sold Price']], axis=1)

# 创建并展示散点图
fig = px.scatter(data, x='Last Sold Price', y='Sold Price')
fig.show()
# 分割特征和标签
y = train_df['Sold Price'].reset_index(drop=True)  # 提取标签(售出价格)并重置索引
train_features = train_df.drop('Sold Price', axis=1)  # 从训练数据中删除标签列,获取训练特征
test_features = test_df.copy()  # 复制测试数据的特征,不做任何修改

# 合并训练和测试特征,重置索引
features = pd.concat([train_features, test_features]).reset_index(drop=True)
features.shape  # 输出特征的形状(维度)

初步处理数据

zip列应作为字符串 并对bedroom列作简单处理

处理卧室数量字段,将含有逗号分隔的多个值减少为一个整数表示卧室数量。
如果字段是NaN或只包含数字,则原样返回。
特别地,如果列表中包含’Walk-in Closet’,则在计算卧室数量时将其排除。

def proc_bedroom(x):
    # 检查x是否不是NaN且不全为数字
    if not pd.isna(x) and not x.isdigit():
        temp = x.split(',')  # 使用逗号分割x
        n = len(x.split(','))  # 计算分割后的部分数量
        if 'Walk-in Closet' in temp:
            n -= 1  # 如果包含'Walk-in Closet',则减少计数
        return n
    else:
        return x  # 如果x是NaN或全为数字,则原样返回

# 应用proc_bedroom函数到features数据框的'Bedrooms'列
features['Bedrooms']=features['Bedrooms'].apply(lambda x: proc_bedroom(x))
# 将'Bedrooms'列转换为数值类型
features['Bedrooms'] = pd.to_numeric(features['Bedrooms'])
# 将'Zip'列转换为字符串类型
features['Zip'] = features['Zip'].astype('str')

缺省值填充

处理缺失数据

# 计算每个特征的缺失值数量并按降序排列
total = features.isnull().sum().sort_values(ascending=False)

# 计算每个特征的缺失值比例并按降序排列
percent = ((features.isnull().sum() / features.isnull().count()) * 100).sort_values(ascending=False)

# 将缺失值数量和比例合并到一个DataFrame中
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])

# 重置索引,以便将特征名称作为行标签
missing_data = missing_data.reset_index()

# 重命名列,以便更直观地理解每个列的含义
missing_data.columns = ['Name', 'Total', 'Percent']

# 显示前10行数据
missing_data[:10]

处理缺失值:对不同的特征采用不同的填充策略

def handle_missing(features):
    # 定义需要填充为0的特征列表
    zero_fill=['Last Sold Price','Lot','Full bathrooms','Annual tax amount','Tax assessed value','Bathrooms',
               'Bedrooms','Total interior livable area','Total spaces','Garage spaces']
    # 定义需要填充为'None'的特征列表
    none_fill=['Last Sold On','Middle School','Appliances included','Flooring','Laundry features','Cooling features',
               'Cooling','Heating features','Heating','Elementary School','High School','Parking features','Parking','Summary']
    # 定义需要填充为最大值的特征列表
    max_fill=['Middle School Score','Middle School Distance','Elementary School Score','Elementary School Distance',
              'High School Score','High School Distance']
    # 定义需要填充为众数的特征列表
    mode_fill=['Year built','Region']
    
    # 分别对各列表中的特征进行缺失值填充
    for c in zero_fill:
        features[c]=features[c].fillna(0)  # 填充为0
    for c in max_fill:
        features[c]=features[c].fillna(features[c].max())  # 填充为最大值
    for c in none_fill:
        features[c]=features[c].fillna('None')  # 填充为'None'
    for c in mode_fill:
        features[c]=features[c].fillna(features[c].mode()[0])  # 填充为众数
    return features

处理缺失值的函数。

def handle_missing(features):
    # 根据具体实现,这里对features进行缺失值处理
    return features

# 对处理后的特征数据进行形状检查,以确保处理过程符合预期
features = handle_missing(features)
features.shape

数据转换

绘制包含直方图、QQ图和箱线图的三维图表,用于数据的可视化分析。

def plotting_3_chart(df, feature):
 
    ## 导入必要的库
    import seaborn as sns
    import matplotlib.pyplot as plt
    import matplotlib.gridspec as gridspec
    from scipy import stats
    import matplotlib.style as style
    style.use('fivethirtyeight')

    ## 创建自定义图表,并设置尺寸
    fig = plt.figure(constrained_layout=True, figsize=(12,8))
    ## 创建一个33列的网格
    grid = gridspec.GridSpec(ncols=3, nrows=3, figure=fig)

    ## 绘制直方图
    ax1 = fig.add_subplot(grid[0, :2])
    ax1.set_title('Histogram')  # 设置标题
    sns.distplot(df.loc[:,feature], norm_hist=True, ax = ax1)  # 绘制直方图

    ## 绘制QQ图
    ax2 = fig.add_subplot(grid[1, :2])
    ax2.set_title('QQ_plot')  # 设置标题
    stats.probplot(df.loc[:,feature], plot = ax2)  # 绘制QQ图

    ## 绘制箱线图
    ax3 = fig.add_subplot(grid[:, 2])
    ax3.set_title('Box Plot')  # 设置标题
    sns.boxplot(df.loc[:,feature], orient='v', ax = ax3);  # 绘制箱线图
# 对目标变量进行对数变换
y = np.log1p(y)

# 绘制销售价格的图表
plotting_3_chart(pd.DataFrame(y), 'Sold Price')

这段代码中包含的两个主要操作是对目标变量y进行对数变换,然后使用plotting_3_chart函数绘制变量的图表。对数变换通常用于处理偏态分布的数据,以使得数据更加适合进行建模和可视化。plotting_3_chart函数的具体细节没有给出,但从调用方式来看,它应该是用于绘制某种基于数据集的图表,此处用于展示销售价格的数据分布。

寻找数值型列并计算偏度

numerical_columns = features.select_dtypes(include=['int64','float64']).columns  # 选择DataFrame中的数值型列

# 计算各数值列的偏度,并按偏度降序排序
skewed_features = features[numerical_columns].apply(lambda x: stats.skew(x)).sort_values(ascending=False)
skewness = pd.DataFrame({'Skew value' :skewed_features})  # 将偏度值存储到DataFrame中
skewness.head(20)  # 打印偏度值前20的特征

此函数接受一个数据框,并返回修正偏度的数据框。

def fix_skew(features):
 
    ## 导入必要的模块 
    from scipy.special import boxcox1p
    from scipy.stats import boxcox_normmax
    
    ## 获取所有非"object"类型的数据
    numerical_columns = features.select_dtypes(include=['int64','float64']).columns

    # 检查所有数值特征的偏度
    skewed_features = features[numerical_columns].apply(lambda x: stats.skew(x)).sort_values(ascending=False)
    high_skew = skewed_features[abs(skewed_features) > 0.5]
    skewed_features = high_skew.index

    # 执行Box-Cox转换
    for column in skewed_features:
        features[column] = boxcox1p(features[column], boxcox_normmax(features[column] + 1))
        
    return features

将输入的数值x与0比较,如果小于0则返回0,否则返回x本身。

def reset_zero(x):

    return max(x,0)

# 对'Garage spaces''Total spaces'两列特征应用reset_zero函数,确保这些特征值非负
features['Garage spaces']=features['Garage spaces'].apply(lambda x: reset_zero(x))
features['Total spaces']=features['Total spaces'].apply(lambda x: reset_zero(x))

# 对数据集中的偏斜特征进行修正,以提高数据分析的准确性
features = fix_skew(features)

# 查看修正后的数据集的前5行
features.head()

将features分离 根据Variable Importances进行挑选

根据给定的特征和目标数据,将特征数据集划分为训练集和测试集。

# 划分数据集为训练集和测试集
x = features.iloc[:len(y), :]
x_test = features.iloc[len(y):, :]

# 打印各数据集的形状
x.shape, y.shape, x_test.shape
# 选择数据集中的特定列
selected=['Listed Price','Tax assessed value','Annual tax amount','Listed On','Elementary School Distance','Last Sold On',
'Zip','Total interior livable area','Last Sold Price','Lot','Year built','Bathrooms','High School Distance',
'Elementary School Score','Full bathrooms','Middle School Distance','Heating features','Bedrooms',
'Elementary School','Laundry features','Region','Middle School Score','Type',
'Total spaces','High School Score','Parking']

# 根据selected列表中的列名,重新选取x和x_test的数据
x=x[selected]
x_test=x_test[selected+['Id']]

# 显示x数据集的前5行
x.head()

这段代码首先定义了一个列表selected,包含了需要在数据集中选取的列名。接下来,通过这个列表来重新定义x和x_test的数据范围,确保它们只包含所需列。最后,使用x.head()来查看x数据集的前5行,以便确认数据选取是否正确。

2.训练

import h2o

# 初始化H2O框架
h2o.init()

# 将数据x和y合并为一个H2OFrame对象
hf = h2o.H2OFrame(pd.concat([x, y], axis=1))

# 将测试数据x_test转换为H2OFrame对象
x_test_hf = h2o.H2OFrame(x_test)

定义预测变量和响应变量

# predictors: 所有可能的预测变量,不包括'Sold Price'
# response: 响应变量,即最终需要预测的目标变量
predictors = hf.drop('Sold Price').columns
response = 'Sold Price'
from h2o.automl import H2OAutoML

# 初始化H2OAutoML对象
# stopping_metric: 指定用于提前停止训练的指标。
aml = H2OAutoML(
    max_models=50,      # 最多训练的模型数量
    include_algos=["XGBoost"],  # 包含的算法列表
    max_runtime_secs=7200,  # 最大运行时间(秒)
    stopping_metric='RMSLE',  # 早停所使用的指标
    sort_metric='RMSLE'   # 用来排序模型的指标
)
aml.train(x=predictors,y=response,training_frame=hf)
# 获取排行榜
lb = aml.leaderboard; lb
model_id rmsle mean_residual_deviance rmse mse mae
XGBoost_grid__1_AutoML_20240403_065546_model_110.0131312 0.03600570.1897520.03600570.0910524
XGBoost_grid__1_AutoML_20240403_065546_model_370.0131671 0.03611080.1900280.03611080.0925486
XGBoost_grid__1_AutoML_20240403_065546_model_6 0.0131991 0.03641610.19083 0.03641610.0909256
XGBoost_grid__1_AutoML_20240403_065546_model_270.0132673 0.03677880.1917780.03677880.0922308
XGBoost_grid__1_AutoML_20240403_065546_model_120.0132762 0.036862 0.1919950.036862 0.0960698
XGBoost_grid__1_AutoML_20240403_065546_model_1 0.013322 0.03690630.19211 0.03690630.0902104
XGBoost_grid__1_AutoML_20240403_065546_model_5 0.0133373 0.03715850.1927650.03715850.0938252
XGBoost_grid__1_AutoML_20240403_065546_model_3 0.0133624 0.03734030.1932360.03734030.0933323
XGBoost_grid__1_AutoML_20240403_065546_model_340.0133976 0.03757660.1938470.03757660.0946864
XGBoost_grid__1_AutoML_20240403_065546_model_430.0134077 0.03746760.1935660.03746760.0939568

3.预测

aml.leader

aml对象中的leader属性,此属性用于访问或设置aml对象的领导者信息。
在这里插入图片描述

meansdcv_1_validcv_2_validcv_3_validcv_4_validcv_5_valid
0mae0.091052410.00184640240.091514410.0892317740.089875240.090660850.0939798
1mean_residual_deviance0.036005740.00230902480.037142050.0339637770.03388290.0356797170.039360262
2mse0.036005740.00230902480.037142050.0339637770.03388290.0356797170.039360262
3r20.943146050.00332824230.943099560.94717080.944158850.943354960.9379462
4residual_deviance0.036005740.00230902480.037142050.0339637770.03388290.0356797170.039360262
5rmse0.189674680.0060473060.192722720.184292630.184073090.188890760.19839421
6rmsle0.0131249754.5185105E-40.0133946940.0126867950.0127565880.01302454250.013762259

Scoring History:

timestampdurationnumber_of_treestraining_rmsetraining_maetraining_deviance
02024-04-03 07:13:0214 min 52.336 sec0.013.26258113.238679175.896051
12024-04-03 07:13:0214 min 52.788 sec5.02.2795322.2487605.196266
22024-04-03 07:13:0214 min 53.141 sec10.00.4607070.4077280.212251
32024-04-03 07:13:0414 min 54.709 sec15.00.2208070.1258730.048756
42024-04-03 07:13:0714 min 57.227 sec20.00.1860110.0902610.034600
52024-04-03 07:13:0914 min 59.816 sec25.00.1702620.0809790.028989
62024-04-03 07:13:1215 min 2.250 sec30.00.1595240.0765300.025448
72024-04-03 07:13:1415 min 4.617 sec35.00.1511180.0736070.022837
82024-04-03 07:13:1715 min 7.209 sec40.00.1433520.0706790.020550
92024-04-03 07:13:1915 min 9.548 sec45.00.1372370.0685770.018834
102024-04-03 07:13:2115 min 11.999 sec50.00.1321350.0668950.017460
112024-04-03 07:13:2415 min 14.550 sec55.00.1267460.0648570.016064
122024-04-03 07:13:2715 min 17.267 sec60.00.1219760.0631220.014878
132024-04-03 07:13:2915 min 20.004 sec65.00.1181790.0616100.013966
142024-04-03 07:13:3215 min 22.702 sec70.00.1140200.0598850.013001
152024-04-03 07:13:3415 min 24.543 sec73.00.1118890.0591140.012519

Variable Importances:

variablerelative_importancescaled_importancepercentage
0Listed Price15757.2910161.0000000.868374
1Listed On426.4607240.0270640.023502
2Annual tax amount231.9940640.0147230.012785
3Zip210.9137570.0133850.011623
4Tax assessed value187.1534880.0118770.010314
5Last Sold On168.8670040.0107170.009306
6Lot160.0650330.0101580.008821
7Last Sold Price145.9303440.0092610.008042
8Total interior livable area130.4094540.0082760.007187
9Year built103.8334660.0065900.005722
10Elementary School Distance66.3114470.0042080.003654
11High School Distance66.1528930.0041980.003646
12Elementary School Score49.9865990.0031720.002755
13Middle School Distance47.6625400.0030250.002627
14Full bathrooms38.8185770.0024640.002139
15Heating features.Other36.0179750.0022860.001985
16High School Score32.6511080.0020720.001799
17Bedrooms29.3886390.0018650.001620
18Total spaces26.3858070.0016750.001454
19Bathrooms22.3935490.0014210.001234

See the whole table with table.as_data_frame()

发现过拟合现象比较严重,这里考虑使用前k个模型的输出取均值进行整合

Reported on train data.

RMSLE: 0.00745891154333034

Reported on cross-validation data.

RMSLE: 0.013097170958722777

根据 leaderboard 中的前k个模型的预测结果,计算它们的平均预测值作为最终预测结果。

# 从指定路径读取提交结果的CSV文件
submission_results = pd.read_csv("/kaggle/input/california-house-prices/sample_submission.csv")

def top_k_avg_predict(k,leaderboard):
 
    lb=leaderboard.as_data_frame()  # 将 leaderboard 转换为 Pandas 数据帧
    ans=submission_results.iloc[:, 1]  # 初始化答案为提交结果数据帧中的第2for i in range(k):
        model=lb.loc[i]['model_id']  # 获取当前排名的模型ID
        pred=h2o.get_model(model).predict(x_test_hf)  # 使用该模型对测试集进行预测
        pred=pred.as_data_frame()  # 将预测结果转换为 Pandas 数据帧
        ans+=np.expm1(pred['predict'])/k  # 将当前模型的预测结果加权平均到答案中
    return ans

# 使用前8个模型的平均预测值更新提交结果数据帧的第2列
submission_results.iloc[:, 1]=top_k_avg_predict(8,aml.leaderboard)
# 显示更新后的前5行数据
submission_results.head()
# 将更新后的提交结果数据帧保存为CSV文件
submission_results.to_csv('submission.csv', index=False)
submission_results.head()
IdSold Price
0474398.252913e+05
1474406.162160e+05
2474418.452799e+05
3474428.266464e+05
4474431.130490e+06

优化建议:

更精细的离群点检测:

可尝试采用更为复杂或自适应的离群点检测算法(如Isolation Forest、Local Outlier Factor等),替代当前基于可视化判断的离群点剔除方式,提高离群点识别的准确性和鲁棒性。

深度特征工程:

进一步探索高级特征工程技术,如交互项构造、特征分桶、地理编码等,以挖掘潜在的非线性关系和地域效应,增强模型捕捉复杂模式的能力。

超参数调优:

虽然已限制AutoML只使用XGBoost算法,但对其内部超参数未做细致调整。可通过网格搜索、随机搜索或贝叶斯优化等方法,对选定算法的超参数进行精细化调优,有望进一步提升单个模型性能。

集成方法改进:

目前采用的是简单平均法进行模型集成,未来可尝试其他更先进的集成策略,如加权平均、Stacking、Bagging、Boosting等,以期获得更好的集成效果。

交叉验证与模型选择:

在模型训练阶段,可以结合交叉验证策略,评估不同模型在多个折叠上的平均性能,从而更加稳健地选择集成模型中的个体模型,避免单一验证集可能导致的过拟合风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最优控制理论笔记 - 01数学准备

目录 一、向量和矩阵的微分 1. 向量对标量的导数 2. 矩阵对标量的导数 2.1 矩阵对标量的导数的运算公式 2.2 标量函数对向量的导数: 2.3 向量函数对向量的导数 二、函数极值的问题 三、有约束条件的函数极值问题 四、n元函数的Taylor 一、向量和矩阵的微分 …

Redis 缓存雪崩、穿透、击穿、预热

在实际工程中,Redis 缓存问题常伴随高并发场景出现。例如,电商大促、活动报名、突发新闻时,由于缓存失效导致大量请求访问数据库,导致雪崩、击穿、穿透等问题。因此,新系统上线前需预热缓存,以应对高并发&a…

RabbitMQ3.x之九_Docker中安装RabbitMQ

RabbitMQ3.x之_Docker中安装RabbitMQ 文章目录 RabbitMQ3.x之_Docker中安装RabbitMQ1. 官网2. 安装1 .拉取镜像2. 运行容器 3. 访问 1. 官网 rabbitmq - Official Image | Docker Hub 2. 安装 1 .拉取镜像 docker pull rabbitmq:3.13.0-management2. 运行容器 # latest Rabb…

LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)

引言 简介 编译Android可用的模型 转换权重 生成配置文件 模型编译 编译apk 修改配置文件 绑定android library 配置gradle 编译apk 手机上运行 安装 APK 植入模型 效果实测 0. 引言 清明时节雨纷纷,路上行人欲断魂。 小伙伴们好,我是《小…

iOS-App:App Store新的审核政策,在应用隐私清单中声明和解释使用特定API的原因

App Store新的审核政策,在应用隐私清单中声明和解释使用特定API的原因 设备/引擎:Mac(11.6)/Mac Mini 开发工具:终端 开发需求:苹果官方邮件通知, App Store新的审核政策,在应用隐…

Transformer学习: Transformer小模块学习--位置编码,多头自注意力,掩码矩阵

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Transformer学习 1 位置编码模块1.1 PE代码1.2 测试PE1.3 原文代码 2 多头自注意力模块2.1 多头自注意力代码2.2 测试多头注意力 3 未来序列掩码矩阵3.1 代码3.2 测试掩码 1 …

绿联 安装halo博客,使用MySQL数据库

绿联 安装halo博客,使用MySQL数据库 1、镜像 halohub/halo:2 halo2系列已支持halohub/halo:2直接拉取最新版本,因此更新容器可以使用相同镜像重新编辑的方式进行升级。 安装前准备: 绿联 安装Mysql 5.7版本数据库 绿联 安装phpmyadmin管理M…

基本线段树以及相关例题

1.线段树的概念 线段树是一种二叉树,也就是对于一个线段,我们会用一个二叉树来表示。 这个其实就是一个线段树,我们会将其每次从中间分开,其左孩子就是左边的集合的和,其右孩子就是右边集合的和; 我们可以…

VSCode常用修改默认设置(settings.json)

❓ 问题1 我现在在vscode中鼠标选中某个单词,相同的单词都会自动出现一个高亮背景色,我需要怎么关闭这个功能呢? ⚠️ 注意 selectionHighlight 这个是鼠标双击后的高亮匹配,可以保留默认开启的配置,不用去改它。 …

力扣每日一题:LCR112--矩阵中的最长递增路径

题目 给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。 示例…

前端入门系列-HTML-HTML结构

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” HTML基础 HTML结构 认识HTML标签 HTML代码是由“标签”构成的。 形如 <body>hello </body> 标签名&#xff08;body&#xff09;放到<>中大部分标签成对…

见证历史:Quantinuum与微软取得突破性进展,开启了可靠量子计算的新时代!

Quantinuum与微软的合作取得了重大突破&#xff0c;将可靠量子计算带入了新的时代。他们结合了Quantinuum的System Model H2量子计算机和微软创新的量子比特虚拟化系统&#xff0c;在逻辑量子比特领域取得了800倍于物理电路错误率的突破。这一创新不仅影响深远&#xff0c;加速…

C#仿OutLook的特色窗体设计

目录 1. 资源图片准备 2. 设计流程&#xff1a; &#xff08;1&#xff09;用MenuStrip控件设计菜单栏 &#xff08;2&#xff09;用ToolStrip控件设计工具栏 &#xff08;3&#xff09;用StatusStrip控件设计状态栏 &#xff08;4&#xff09;ImageList组件装载树节点图…

【ORB-SLAM3】Ubuntu20.04 使用 RealSense D435i 运行 ORB-SLAM3 时遇到的一些 Bug

【ORB-SLAM3】使用 RealSense D435i 跑 ORB-SLAM3 时遇到的一些 Bug 1 hwmon command 0x80( 5 0 0 0 ) failed (response -7 HW not ready)2 No rule to make target /opt/ros/noetic/lib/x86_64-linux-gnu/librealsense2.so, needed by ../lib/libORB_SLAM3.so 1 hwmon comman…

微信小程序 python+django口腔牙科问诊系统 springboot设计与实现_1171u

口腔助手”小程序主要有管理员&#xff0c;医生和用户三个功能模块。以下将对这三个功能的作用进行详细的剖析。 本文通过采用B/S架构&#xff0c;uniapp框架、MySQL数据库&#xff0c;结合国内“口腔助手”管理现状&#xff0c;开发了一个基于微信小程序的“口腔助手”小程序。…

基于ArrayList实现简单洗牌

前言 在之前的那篇文章中&#xff0c;我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE 基于此&#xff0c;便好理解ArrayList和后面的洗牌游戏了。 什么是ArrayList? ArrayList底层是一段连续的空间&#xff0c;并且可以动态扩容&#xff0c;是一个动态类型的顺序表&…

二、企业级架构之Nginx

一、Nginx的重装与升级 1、为什么需要重装与升级&#xff1a; 在实际业务场景中&#xff0c;需要使用软件新版本的功能、特性&#xff0c;就需要对原有软件进行升级或者重装操作。 Nginx&#xff1a;1.12版本 → 1.16版本 2、Nginx重装&#xff1a; 第一步&#xff1a;停止…

linux操作系统的进程状态

这个博客只是为了自己复习用的&#xff01;&#xff01;&#xff01; 冯诺依曼体系结构 计算机是由一个一个硬件组成的 输入设备&#xff1a;键盘&#xff0c;鼠标&#xff0c;扫描仪&#xff0c;写板等等 中央处理器&#xff08;CPU&#xff09;:含有运算器和控制器等 输出单…

Vue-05

v-model 应用于其他表单元素 常见的表单元素都可以用v-model绑定关联 → 快速获取或设置表单元素的值 它会根据控件类型自动选取正确的方法来更新元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name…

树莓派部署yolov5实现目标检测(ubuntu22.04.3)

最近两天搞了一下树莓派部署yolov5&#xff0c;有点难搞&#xff08;这个东西有点老&#xff0c;版本冲突有些包废弃了等等&#xff09; 最后换到ubuntu系统弄了&#xff0c;下面是我的整体步骤&#xff08;建议先使能一下ssh&#xff08;最下面有&#xff09;&#xff0c;结合…