如何基于Simple Linear Regression构建一对一多语言分类模型
基于一对多策略构建22个二分类线性回归模型
你要实现的是**一对多(One-vs-Rest)**的多分类方案,给每种语言单独训练一个二分类线性回归模型,判断样本是否属于该语言。具体改写目标变量y的方式和代码调整如下:
核心思路
原数据集的y是0到21的多分类编码(对应22种语言),现在对每一种语言编码i(0≤i≤21),生成一个新的二分类标签数组:
- 当原标签等于
i时,标记为1(表示属于该语言) - 其余所有样本标记为0(表示不属于该语言)
我们需要循环处理每个语言编码,为每个编码训练一个独立的线性回归模型,并把所有模型保存下来用于后续预测。
调整后的完整代码
import numpy as np import pandas as pd from sklearn import preprocessing from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split # 加载数据集 df = pd.read_csv('https://github.com/KseniaGiansar/AMA/raw/9109fd16d2cafcc25b2f5ee4373ca19dabe76a67/df_languages.csv') label_encoder = preprocessing.LabelEncoder() df['language'] = label_encoder.fit_transform(df['language']) # 提取特征和原始多分类标签 x = np.array(df['Text']) y = np.array(df['language']) # 原始多分类标签 vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(x) # 划分训练测试集 X_train, X_test, y_train_multi, y_test_multi = train_test_split(X, y, test_size=0.33, random_state=3) # 存储22个二分类模型 models = [] num_classes = len(label_encoder.classes_) # 循环训练每个二分类模型 for class_idx in range(num_classes): # 生成当前类别的二分类标签:属于该类为1,否则为0 y_train_binary = np.where(y_train_multi == class_idx, 1, 0) # 初始化并训练模型 model = LinearRegression() model.fit(X_train, y_train_binary) models.append(model) # 预测示例:对单个测试样本进行分类 def predict_language(text): # 提取文本特征 text_vec = vectorizer.transform([text]) # 获取每个模型的输出值(作为置信度) predictions = [model.predict(text_vec)[0] for model in models] # 取置信度最高的模型对应的语言 predicted_class_idx = np.argmax(predictions) return label_encoder.inverse_transform([predicted_class_idx])[0] # 测试预测 sample_text = "Hello, this is an English sentence." print(predict_language(sample_text))
关键说明
- 标签改写:用
np.where()快速将多分类标签转换为二分类标签,每个模型对应唯一的目标语言,这样每个模型只需要学习“是/不是该语言”的判别逻辑。 - 模型存储:把22个训练好的模型存入列表,后续预测时可以批量调用。
- 预测逻辑:线性回归的输出值可以看作样本属于该语言的“置信度”,取输出值最大的模型对应的语言作为最终分类结果。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

