2023年美赛C题Wordle预测问题二建模及Python代码详细讲解

简介: 本文通过Python代码详细讲解了2023年美赛C题Wordle预测问题二的建模过程,包括数据预处理、特征工程、时间特征提取以及使用线性回归模型进行预测和评估。

在这里插入图片描述

更新时间:2023-2-19

相关链接

(1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解
(2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解
(3)2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解
(4)2023年美赛C题Wordle预测问题27中文页论文

1 数据分析与特征工程

(1)将2023-3-1的EERIR样本,加入到数据集中,和所有数据集一起预处理和做特征工程。

特征工程中,和问题一第二问中类同的是,提取了’w1’,‘w2’,‘w3’,‘w4’,‘w5’,‘Vowel_fre’,'Consonant_fre’这几个特征,再加上时间特征包括年、月、日、季节、样本序号。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns


df = pd.read_excel('data/Problem_C_Data_Wordle.xlsx',header=1)
data = df.drop(columns='Unnamed: 0')
data.loc[len(data)] = ['2023-3-1',np.nan,'eerie',np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
data['Date'] = pd.to_datetime(data['Date'])
df =data.copy()
df['Words']  = df['Word'].apply(lambda x:str(list(x))[1:-1].replace("'","").replace(" ",""))
df['w1'], df['w2'],df['w3'], df['w4'],df['w5'] = df['Words'].str.split(',',n=4).str
df

在这里插入图片描述

small = [str(chr(i)) for i in range(ord('a'),ord('z')+1)]
letter_map = dict(zip(small,range(1,27)))
letter_map

{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5, ‘f’: 6, ‘g’: 7, ‘h’: 8, ‘i’: 9, ‘j’: 10, ‘k’: 11, ‘l’: 12, ‘m’: 13, ‘n’: 14, ‘o’: 15, ‘p’: 16, ‘q’: 17, ‘r’: 18, ‘s’: 19, ‘t’: 20, ‘u’: 21, ‘v’: 22, ‘w’: 23, ‘x’: 24, ‘y’: 25, ‘z’: 26}

df['w1'] = df['w1'].map(letter_map)
df['w2'] = df['w2'].map(letter_map)
df['w3'] = df['w3'].map(letter_map) 
df['w4'] = df['w4'].map(letter_map)
df['w5'] = df['w5'].map(letter_map)
df.set_index('Date',inplace=True)
df.sort_index(ascending=True,inplace=True)

df

在这里插入图片描述

(2)统计元音辅音频率

Vowel = ['a','e','i','o','u'] 
Consonant = list(set(small).difference(set(Vowel)))
def count_Vowel(s):
    c = 0
    for i in range(len(s)):
        if s[i] in Vowel:
            c+=1
    return c
def count_Consonant(s):
    c = 0
    for i in range(len(s)):
        if s[i] in Consonant:
            c+=1
    return c

df['Vowel_fre'] = df['Word'].apply(lambda x:count_Vowel(x)) 
df['Consonant_fre'] = df['Word'].apply(lambda x:count_Consonant(x))

(3)提取时间特征

df["year"] = df.index.year
df["qtr"] = df.index.quarter
df["mon"] = df.index.month
df["week"] = df.index.week
df["day"] = df.index.weekday
df["ix"] = range(0,len(data))
time_features = ['year','qtr','mon','week','day','ix']
df

在这里插入图片描述

(3)构造数据集

from sklearn.preprocessing import StandardScaler
features = ['w1','w2','w3','w4','w5','Vowel_fre','Consonant_fre']+time_features
label = ['1 try','6 tries','6 tries','6 tries','6 tries','6 tries','7 or more tries (X)']
Trian_all = df[features+label].copy().dropna()
X = Trian_all[features]

# 标准化
ss = StandardScaler()
X_1 = ss.fit_transform(X)
Y_1= Trian_all[label[0]]
Y_2= Trian_all[label[1]]
Y_3= Trian_all[label[2]]
Y_4= Trian_all[label[3]]
Y_5= Trian_all[label[4]]
Y_6= Trian_all[label[5]]
Y_7= Trian_all[label[6]]
Trian_all

在这里插入图片描述

2 模型预测与评估


from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

X_train, X_test, y_train, y_test = train_test_split(X_1,Y_1, test_size=0.1, random_state=0)

reg = LinearRegression().fit(X_train, y_train)
p_pred = reg.predict(X_test)
test_df =pd.DataFrame(y_test,columns=label)
test_df['pred_1'] = p_pred
# 计算误差
from sklearn.metrics import mean_squared_error
RMSE_1 = np.sqrt(mean_squared_error(test_df[label[0]],test_df['pred_1']))
print(f'第1个模型,RMSE误差是:{RMSE_1}')
# 预测结果可视化
test_df[[label[0],'pred_1']].plot()
plt.legend()
plt.savefig('img/3.png',dpi=300)
plt.show()

然后训练7个回归模型。

第1个模型,RMSE误差是:0.901305736956438

剩余的6个模型,复制粘贴代码,改一下标签就行。

在这里插入图片描述

3 预测EERIE难度

# 训练所有模型

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
features = ['w1','w2','w3','w4','w5','Vowel_fre','Consonant_fre']+time_features
label = ['1 try','2 tries','3 tries','4 tries','5 tries','6 tries','7 or more tries (X)']
Trian_all = df[features+label].copy().dropna()
X = Trian_all[features]

# 标准化
ss = StandardScaler()
X_1 = ss.fit_transform(X)
Y_1= Trian_all[label[0]]
Y_2= Trian_all[label[1]]
Y_3= Trian_all[label[2]]
Y_4= Trian_all[label[3]]
Y_5= Trian_all[label[4]]
Y_6= Trian_all[label[5]]
Y_7= Trian_all[label[6]]

reg1 = LinearRegression().fit(X_1, Y_1)
reg2 = LinearRegression().fit(X_1, Y_2)
reg3 = LinearRegression().fit(X_1, Y_3)
reg4 = LinearRegression().fit(X_1, Y_4)
reg5 = LinearRegression().fit(X_1, Y_5)
reg6 = LinearRegression().fit(X_1, Y_6)
reg7 = LinearRegression().fit(X_1, Y_7)

X_pred = ss.fit_transform(np.array(df.loc['2023-3-1'][features]).reshape(1,-1))
p_pred1 = reg1.predict(X_pred)
p_pred2 = reg2.predict(X_pred)
p_pred3 = reg3.predict(X_pred)
p_pred4 = reg4.predict(X_pred)
p_pred5 = reg5.predict(X_pred)
p_pred6 = reg6.predict(X_pred)
p_pred7 = reg7.predict(X_pred)

print(p_pred1,p_pred2,p_pred3,p_pred4,p_pred5,p_pred6,p_pred7)

进行预测3月1号的EERIR的百分比,结果如下

[0.46327684] [5.77683616] [22.67231638] [32.97457627] [23.68361582] [11.5819209] [2.81920904]

评价模型的好坏,除了上面的RMSE还有MAPE、MAE、MSE等误差的计算方法,都可以计算一下,做一个表格来评价模型。

改进的地方,就是可以对比其他的机器学习回归模型,比如KNN回归、随机森林回归等。

3 Code

Code获取,在浏览器中输入:betterbench.top/#/40/detail,或者Si我

其他问题,在我主页查看,或者文章首部点击

目录
相关文章
|
3天前
|
设计模式 缓存 开发者
Python中的装饰器:简化代码,提高可读性
【9月更文挑战第10天】在Python编程的世界中,装饰器是一种强大的工具,它允许开发者在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和生动的例子,带你了解装饰器的概念、使用方法及其在实际开发中的应用价值。我们将一起探索如何利用装饰器来简化代码结构,提升代码的可读性和可维护性,让你的编程之旅更加顺畅。
|
1天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
15 8
|
9天前
|
Python
探索Python中的装饰器:简化代码,增强功能
【9月更文挑战第3天】在Python的世界里,装饰器是那些静悄悄站在角落、却能大大改变游戏规则的神奇工具。它们就像是给你的函数穿上一件隐形的超级英雄斗篷,让函数拥有了超乎寻常的能力。本文将带领你一探究竟,看看如何通过几行简单的代码,就能让你的函数变得更加智能和强大。
|
3天前
|
开发者 Python
Python中的装饰器:简化你的代码
【9月更文挑战第9天】本文将介绍Python中的一种强大工具——装饰器。我们将从基础概念开始,逐步深入到装饰器的实际应用,包括函数装饰器和类装饰器。我们将通过实例来展示如何利用装饰器简化代码,提高代码的可读性和可维护性。最后,我们将探讨装饰器的一些高级用法,以及如何避免在使用时可能遇到的问题。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解和使用装饰器。
12 6
|
5天前
|
Python
揭秘!Python系统编程里那些让代码自由穿梭的神奇代码行
【9月更文挑战第9天】在Python的世界里,一些简洁的代码行却蕴含着强大的功能,如列表推导式让列表生成仅需一行代码:`squares = [x**2 for x in range(10)]`。`with`语句则能自动管理文件和网络连接的关闭,如`with open('example.txt', 'r') as file:`。`lambda`函数和装饰器则允许快速定义函数和增强功能,而上下文管理器更是资源处理的利器。这些特性让Python代码更加优雅高效。
15 4
|
6天前
|
缓存 测试技术 开发者
探索Python中的装饰器:简化你的代码之旅
【9月更文挑战第6天】本文将深入探讨Python中一个强大而神秘的特性——装饰器。我们将通过实际例子揭示装饰器的工作原理,并展示如何利用它们来简化和增强你的代码。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇门,让你的代码更加优雅和高效。
|
3天前
|
安全 数据安全/隐私保护 Python
Python系统编程实战:文件系统操作与I/O管理,让你的代码更优雅
【9月更文挑战第10天】Python不仅在数据分析和Web开发中表现出色,在系统编程领域也展现出独特魅力。本文将带你深入探讨Python中的文件系统操作与I/O管理,涵盖os、shutil和pathlib等模块的基础使用方法,并通过示例代码展示如何优雅地实现这些功能。通过掌握缓冲、异步I/O等高级特性,你将能够编写更高效、安全且易于维护的Python代码。示例包括使用pathlib遍历目录、设置缓冲区提升文件写入性能以及使用aiofiles实现异步文件操作。掌握这些技能,让你在Python系统编程中更加得心应手。
10 2
|
9天前
|
Python
Python中的装饰器:简化你的代码
【9月更文挑战第3天】装饰器,这个听起来有些神秘的名词,实际上在Python中扮演着重要的角色。它们就像是你的代码的小助手,帮你自动完成一些重复性的工作,让你的代码更加简洁、易读。本文将通过一个简单的例子,带你走进装饰器的世界,看看它们是如何工作的。
|
9天前
|
测试技术 数据安全/隐私保护 Python
Python中的装饰器:简化你的代码
【9月更文挑战第3天】装饰器在Python中是一个非常强大的工具,它可以让我们在不改变原有函数定义的情况下,对函数进行扩展,增加额外的功能。本文将通过一个简单的例子,介绍如何在Python中使用装饰器,以及如何使用装饰器来简化我们的代码。
15 6
|
8天前
|
缓存 数据挖掘 Python
探索Python中的装饰器:简化代码,提高效率
【9月更文挑战第4天】在Python的世界里,装饰器是那些隐藏在幕后、默默发挥作用的英雄。它们以优雅的姿态简化我们的代码,提升程序的可读性和效率。本文将带你揭开装饰器的神秘面纱,通过实际案例展示其魅力所在,让你的编程之旅更加顺畅。