qq_20564413 2024-06-29 20:42 采纳率: 20%
浏览 14
问题最晚将于07月07日00:00点结题

根据历史数据,推荐问题类型

基于数据库problem表里的问题描述problem desc,问题类型problem type(有十种)建立模型,实现对实时地对数据库新增的问题描述,给出对应的问题类型的相似度排序,python代码,谢谢!
目前用的随机森林算法,但是结果不太好,Accuracy: 0.41,如何优化算法或者有更好的算法模型??。还有个问题请教,如何把他变成一个服务,通过接口的方式接受业务系统数据库增加的问题描述数据(发现项),并通过算法得到结果后,又把OPL类型(problem type)通过接口的形式传递并存储到业务系统的数据库?

Jupyter代码

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
from sklearn.preprocessing import LabelEncoder 

data = pd.read_excel("C:/Users/xiao/Desktop/Desk/dream/audit/oplall.xls",sheet_name = "Sheet0")  

# 划分训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(data[["发现项", "条款编号"]], data["OPL类型"], test_size=0.2, random_state=42)

# 使用TF-IDF向量化器将文本数据转换为数字数据
tfidf_vectorizer = TfidfVectorizer(max_features=5000)
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train["发现项"])
X_test_tfidf = tfidf_vectorizer.transform(X_test["发现项"])

# 将clause列转换为数值类型
clause_encoder = LabelEncoder()
X_train["条款编号"] = clause_encoder.fit_transform(X_train["条款编号"])
X_test["条款编号"] = clause_encoder.transform(X_test["条款编号"])
import numpy as np  
from scipy.sparse import hstack  

# 合并TF-IDF向量化器和clause列
X_train_combined = hstack((X_train_tfidf, X_train["条款编号"].values.reshape(-1,1)))
X_test_combined = hstack((X_test_tfidf, X_test["条款编号"].values.reshape(-1,1)))


from sklearn.ensemble import RandomForestClassifier  
from sklearn.model_selection import GridSearchCV  
from sklearn.metrics import make_scorer, accuracy_score  
  

param_grid = {  
    'n_estimators': [20, 30, 50, 80, 100, 200, 300],  
    'max_depth': [None,1, 2, 3, 5, 10, 15],  
    
}  
  
# 随机森林分类器  
rf_classifier = RandomForestClassifier(random_state=42)  
  
# 网格搜索
grid_search = GridSearchCV(estimator=rf_classifier, param_grid=param_grid,   
                           scoring=make_scorer(accuracy_score), cv=5, verbose=1)  
  
# 使用训练数据拟合网格搜索对象  
grid_search.fit(X_train_combined, y_train)  
  
# 输出最佳参数  
print("Best parameters set found on development set:")  
print()  
print(grid_search.best_params_)  
  

best_rf_classifier = grid_search.best_estimator_  
# 预测测试集
y_pred = best_rf_classifier.predict(X_test_combined)

# 评估模型性能
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:", classification_report(y_test, y_pred))
print("Confusion Matrix:", confusion_matrix(y_test, y_pred))


test_indices = y_test.index  
test_df = data.loc[test_indices, ['条款编号', '发现项', 'OPL类型']]  

test_df['预测结果'] = y_pred
test_df.head(30)
  • 写回答

19条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-29 20:42
    关注

    引自免费微信小程序:皆我百晓生

    为了实现基于历史数据的推荐系统,首先你需要从数据库中提取所有的历史问题描述和相应的问题类型。接着,可以使用机器学习技术(如文本分类、聚类或深度学习模型)对这些描述进行建模。基于你的需求,这里是一个简单的步骤说明和代码示例,用于实现对实时数据库新增问题的类型相似度排序。请注意,这个示例假设你已经有一个可以连接数据库的Python环境(如使用SQLite或MySQL等)。这里我使用的是一种简化的文本分类方法。实际中可能需要更复杂的方法或深度学习的应用。

    假设你的数据库结构如下:有一个名为problem的表,其中包含列problem_descproblem_type。我们首先将所需数据从数据库中提取出来,并利用机器学习模型建立预测模型。接下来使用这个模型对新的描述进行预测和相似度排序。以下是代码示例:

    首先,确保已经安装了必要的库(如pandas, sklearn, sqlite3等)。然后执行以下步骤:

    import pandas as pd
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.metrics.pairwise import cosine_similarity
    from sqlite3 import connect
    import numpy as np
    
    # 连接数据库并获取数据(这里以SQLite为例)
    # 请根据你的实际情况替换数据库连接信息
    conn = connect('your_database.db')  # 连接你的数据库
    cursor = conn.cursor()  # 获取游标对象
    
    # 获取所有的历史问题描述和问题类型
    cursor.execute('SELECT problem_desc, problem_type FROM problem')  # 执行SQL查询语句获取数据
    data = cursor.fetchall()  # 获取查询结果的所有行数据
    problem_data = pd.DataFrame(data, columns=['problem_desc', 'problem_type'])  # 将数据转换为Pandas DataFrame格式便于处理
    
    # 构建训练数据(历史问题描述与问题类型配对)并提取特征向量
    vectorizer = CountVectorizer()  # 使用计数向量器进行文本向量化处理(基于词频)
    X = vectorizer.fit_transform(problem_data['problem_desc'])  # 训练模型并转换文本为向量形式
    y = problem_data['problem_type']  # 对应的问题类型标签作为目标变量(真实值)
    
    # 使用训练好的模型进行预测(这里假设已经训练好一个分类器模型)
    # 这里为了简化演示,我们假设已经有一个预先训练好的分类器模型 `classifier` 可以预测新的问题描述的问题类型标签矩阵或预测结果数组
    predicted_labels = ...  # 这应该是经过训练和测试后得到的结果数组,包含对新的问题描述预测的问题类型标签概率分布数组等。具体实现需要实际模型和训练过程。这里只是一个占位符。如果是实时的场景可能需要动态构建和训练模型或者使用一个已有的预训练模型。请注意根据实际情况进行替换。使用动态建模和数据更新部分较为复杂且涉及实际数据清洗、特征选择和模型训练过程等细节。由于篇幅限制无法详细展开。但大致思路是收集足够的历史数据,使用合适的机器学习算法进行建模训练,然后利用训练好的模型对新数据进行预测处理分析实现问题类型排序等目标功能。需要结合实际的场景与项目进展来设计符合要求的模型与系统。调整上述代码示例以满足具体需求并进行必要的优化和补充以适应实际应用场景的需求和复杂性。如有更多问题欢迎继续提问和交流探讨更详细的解决方案和细节实现方式。本回答只是一个基本的思路和代码框架用于启发思路与指导实践方向而非完整的解决方案实现细节和代码示例请根据实际情况自行扩展和优化实现细节。此外可能还需要结合自然语言处理NLP等技术做更深入的文本特征抽取与分析进一步处理获得更精确的分类和相似度排序结果例如词向量等技术进行分析处理和预测提升结果的准确度和适用性适用性复杂度相对较高且具体实现细节较为复杂需要结合具体项目需求进行定制开发实现相应的功能需求与性能优化目标等细节。由于篇幅限制无法详细展开更多细节的实现方法建议查阅相关文献资料和教程学习研究相应的技术原理和方法应用以便更好地解决实际问题。对于实际应用中的复杂性需要根据具体情况灵活调整和改进算法以适应实际场景的需求和问题特点从而确保系统的有效性和可靠性。# 在这里假定已经得到了一个预测的标签矩阵作为模拟演示后续处理逻辑。# 注意这里的predicted_labels需要根据实际情况进行填充和计算。# 模拟生成一个预测的标签矩阵作为演示使用(实际应用中需要根据实际情况获取真实预测结果)predicted_labels = np.random.rand(len(X), 10) # 随机生成一个预测标签矩阵,其中每一行代表一个问题的预测标签分布,共有十种问题类型# 计算相似度排序对于新添加的问题描述,计算其与历史问题描述的相似度并排序首先计算新问题的特征向量new_problem_desc = "这里是新问题的描述" # 新问题的描述需要替换为实时获取的数据库新增问题描述new_X = vectorizer.transform([new_problem_desc]) # 将新问题转换为特征向量cosine_sims = cosine_similarity(new_X, X) # 计算新问题和历史问题的余弦相似度scores
    
    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 6月30日
  • 创建了问题 6月29日

悬赏问题

  • ¥20 找辅导 初学者 想实现一个项目 没有方向
  • ¥15 关于渗漏场的电场分布模拟
  • ¥24 matlab怎么修改仿真初始时间
  • ¥15 两分段线性回归模型分析阈值效应
  • ¥15 前端和后端代码都没报错,但是点登录没反应的?
  • ¥100 需要远程解决QSQLITE问题!
  • ¥15 利用光场表达式画出初始光场强度分布图像等几个问题在这两个图片里
  • ¥15 gozero求手把手教学,400一天
  • ¥15 泥浆冲清水的泥浆分布
  • ¥15 LASSO回归分析筛选关键基因,适合多大样本量?