目前,我有一个数据集,其中包含两个列:手术名称及其CPT码。例如,全膝关节置换术-27447,全髋关节置换术-27130,开放性腕管释放术-64721。数据集有3000行,总共有5个CPT代码(5个类别)。我正在编写一个分类模型。当我输入一些错误的数据时,例如,“开放性膝关节置换术腕管释放术”,它给出的输出是64721,这是错误的。以下是我使用的代码。请问我可以在代码中做哪些更改,以及选择神经网络来解决这个问题是否合适?
import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfTransformerfrom sklearn.neural_network import MLPClassifierxl = pd.ExcelFile("dataset.xlsx") # 读取数据df = xl.parse('Query 2.2') # 打乱数据df=df.sample(frac=1)X_train, X_test, y_train, y_test = train_test_split(df['procedure'], df['code'], random_state = 0,test_size=0.10)count_vect = CountVectorizer().fit(X_train)X_train_counts = count_vect.transform(X_train)tfidf_transformer = TfidfTransformer().fit(X_train_counts)X_train_tfidf = tfidf_transformer.transform(X_train_counts) model= MLPClassifier(hidden_layer_sizes=(25),max_iter=500)classificationModel=model.fit(X_train_tfidf, y_train)data_to_be_predicted="open knee arthroplasty carpal tunnel release"result = classificationModel.predict(count_vect.transform([data_to_be_predicted]))predictionProbablityMatrix = classificationModel.predict_proba(count_vect.transform([data_to_be_predicted]))maximumPredictedValue = np.amax(predictionProbablityMatrix)if maximumPredictedValue * 100 > 99: print(result[0])else: print("00000")
回答:
我建议你使用Keras来解决这个问题。你在分割训练和测试数据后使用sklearn对数据进行的所有处理都可以使用numpy和Keras来完成,这样会更加可读且更易于理解正在发生什么。如果它们都是字符串,你应该使用内部Python代码按行分割数据,例如
row = data[i].split(',')
这样就可以将行中的三个列分割开来。如果你有5个新类别,那么我会将所有类别的名称替换为数据集中的数字。我从未使用过Sklearn来实现神经网络,但看起来你使用了25个隐藏的NN层,对吗?我认为你不需要这么多,3层就足够了。
很抱歉我无法更精确地帮助你解决问题,但我认为如果你按照我说的重新做,你可以更轻松地解决问题…祝你好运,伙计!
编辑:也许问题不在于解析后的数据集,而在于NN的实现,这就是为什么我认为Keras更清晰的原因