Python文本分类总结:贝叶斯,逻辑回归,决策树,随机森林,SVM,词向量,TFIDF,神经网络,CNN,LSTM,GRU,双向RNN,LDA

Task4:Pytorch实现模型训练与验证 目录一、前言二、模型训练与验证三、保存模型与调参 一、前言 DL中,当构建了一个CNN模型,只是定义了一个Input、Output接口,无论是单张图片还是Batch多张图片,都需要取训练这个模型以达到目的得参数,训练一个模型一般有三个步骤: 分别定义两个数据集trainsets和validsets,分别完成模型的训练与验证 保存最优参数(权重、偏置等) 记录trainsets和validsets的精度,便于调参。 通过以上的步骤,可以得到CNN模型的参数了,利用训练的参数可以对任意输入图像进行测试了。 阅读详情

前言

上篇文本分类实验结果
本篇首发日期:2020-9-27
本篇实验详细结果及代码
本篇python版本:3.7.4
本篇sklearn版本:0.21.3
本篇keras版本:2.3.1

语料

统计

类别数量类别数量
science2093car2066
finance2052sports2017
military2007medicine2000
entertainment1906politics1865
education1749fashion1712

待测数据是否已知?

  • 实际工作中,待测数据可能已知,也可能未知,其监督学习方法可以有所不同
  • 此实验待测数据已知
训练
预测
特征工程
训练
训练
预测
待测数据未知
标注数据
有监督学习模型
未知数据
待测数据已知
未标注数据+标注数据
特征
有监督学习模型
标注数据
未标注数据

代码

TFIDF+【贝叶斯、逻辑回归、决策树、随机森林】

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
import jieba, warnings
from segment import tk
from data10 import load_xy
warnings.filterwarnings('ignore')  # 不打印警告
DISCARD_FLAG = {'c', 'd', 'e', 'o', 'p', 'r', 'u', 'uv', 'y', 'NUM'}  # 词性排除
N = 25000  # 最大词数


def cut1(text):
    for word in tk.cut(text):
        if tk.get_flag(word) not in DISCARD_FLAG:
            yield word


def cut2(text):
    words = tk.lcut(text)
    for i in range(len(words) - 1):
        yield words[i]
        yield words[i] + words[i + 1]
    yield words[-1]


def cut_flag(text):
    for word in tk.cut(text):
        flag = tk.get_flag(word)
        if tk.get_flag(word) not in DISCARD_FLAG:
            yield word
            yield flag


def experiment(test_size=.5, random_state=7):
    x, (train, test, y_train, y_test) = load_xy(test_size, random_state)
    vec_ls = (
        CountVectorizer(tokenizer=tk.cut, max_features=N),
        CountVectorizer(tokenizer=cut1, max_features=N),
        CountVectorizer(tokenizer=cut2, max_features=N),
        CountVectorizer(tokenizer=cut_flag, max_features=N),
        CountVectorizer(tokenizer=jieba.cut, max_features=N),
        TfidfVectorizer(tokenizer=tk.cut, max_features=N),
        TfidfVectorizer(tokenizer=cut1, max_features=N),
        TfidfVectorizer(tokenizer=cut2, max_features=N),
        TfidfVectorizer(tokenizer=cut_flag, max_features=N),
        TfidfVectorizer(tokenizer=jieba.cut, max_features=N),
    )
    clf_ls = (
        MultinomialNB(),
        LogisticRegression(solver='liblinear'),
        DecisionTreeClassifier(),
        RandomForestClassifier(),
        SVC(kernel='linear'),
    )
    for x_fit in (train, x):
        for vec in vec_ls:
            vec.fit(x_fit)
            x_train = vec.transform(train)
            x_test = vec.transform(test)
            for clf in clf_ls:
                t0 = tk.second
                clf.fit(x_train, y_train)
                print(clf.__class__.__name__, tk.second - t0, clf.score(x_test, y_test))
            tk.yellow(vec)


experiment()

词向量+TFIDF+【贝叶斯、逻辑回归、决策树、随机森林、SVM】

from gensim.models import Word2Vec
from math import log10
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
import numpy as np, copy, warnings
from segment import tk, clean
from data10 import load_xy
warnings.filterwarnings('ignore')  # 不打印警告
DISCARD_FLAG = {'c', 'd', 'e', 'o', 'p', 'r', 'u', 'uv', 'y', 'NUM'}


def cut1(text):
    for word in tk.cut(text):
        if tk.get_flag(word) not in DISCARD_FLAG:
            yield word


class Word2Vector:
    def __init__(self, cut, size=75, window=7, min_count=3):
        self.size = size
        self.window = window
        self.min_count = min_count
        self.cut = cut
        self.wv = None
        self.vectors = None
        self.w2i = None

    def unit_vector(self):
        self.vectors = self.vectors / np.linalg.norm(self.vectors, axis=1).reshape(-1, 1)

    def idf(self, texts):
        texts = [set(self.cut(t)) for t in texts]
        lent = len(texts)
        self.vectors = self.vectors * np.array(
            [[log10(lent / (sum((w in t) for t in texts) + 1))] for w in self.wv.index2word])

    def fit(self, texts):
        sentences = [list(self.cut(s)) for t in texts for s in clean.text2clause(t)]  # 文本切分
        wv = Word2Vec(sentences, size=self.size, window=self.window, min_count=self.min_count).wv  # 词向量
        self.w2i = {w: i for i, w in enumerate(wv.index2word)}
        self.vectors = wv.vectors
        self.wv = wv

    def text2vector(self, texts):
        return [[self.vectors[self.w2i[w]] for w in self.cut(t) if w in self.w2i] for t in texts]

    def vector_sum(self, texts):
        return [np.sum(v, axis=0) if v else np.zeros(self.size) for v in self.text2vector(texts)]

    def vector_mean(self, texts):
        return [np.mean(v, axis=0) if v else np.zeros(self.size) for v in self.text2vector(texts)]


def experiment(test_size=.5, random_state=7):
    x, (train, test, y_train, y_test) = load_xy(test_size, random_state)
    vec_ls = (
        Word2Vector(tk.cut),
        Word2Vector(cut1),
        Word2Vector(tk.cut, 150),
        Word2Vector(cut1, 150),
    )
    clf_ls = (
        LogisticRegression(solver='liblinear'),
        DecisionTreeClassifier(),
        RandomForestClassifier(),
        SVC(kernel='linear', max_iter=500),
        SVC(max_iter=1000),
    )
    for x_fit in (train, x):
        for vec in vec_ls:
            vec.fit(x_fit)
            # sum
            tk.yellow('*****sum')
            x_train, x_test = vec.vector_sum(train), vec.vector_sum(test)
            for clf in clf_ls:
                t0 = tk.second
                clf.fit(x_train, y_train)
                print(clf.__class__.__name__, tk.second - t0, clf.score(x_test, y_test))
            # mean
            tk.yellow('*****mean')
            x_train, x_test = vec.vector_mean(train), vec.vector_mean(test)
            for clf in clf_ls:
                t0 = tk.second
                clf.fit(x_train, y_train)
                print(clf.__class__.__name__, tk.second - t0, clf.score(x_test, y_test))
            # sum unit_vector
            tk.yellow('*****sum unit_vector')
            vec1 = copy.deepcopy(vec)
            vec1.unit_vector()
            x_train, x_test = vec1.vector_sum(train), vec1.vector_sum(test)
            for clf in clf_ls:
                t0 = tk.second
                clf.fit(x_train, y_train)
                print(clf.__class__.__name__, tk.second - t0, clf.score(x_test, y_test))
            # mean unit_vector
            tk.yellow('*****mean unit_vector')
            x_train, x_test = vec1.vector_mean(train), vec1.vector_mean(test)
            for clf in clf_ls:
                t0 = tk.second
                clf.fit(x_train, y_train)
                print(clf.__class__.__name__, tk.second - t0, clf.score(x_test, y_test))
            del vec1
            # sum idf
            tk.yellow('*****sum idf')
            vec.idf(x_fit)
            x_train, x_test = vec.vector_sum(train), vec.vector_sum(test)
            for clf in clf_ls:
                t0 = tk.second
                clf.fit(x_train, y_train)
                print(clf.__class__.__name__, tk.second - t0, clf.score(x_test, y_test))
            # mean idf
            tk.yellow('*****mean idf')
            x_train, x_test = vec.vector_mean(train), vec.vector_mean(test)
            for clf in clf_ls:
                t0 = tk.second
                clf.fit(x_train, y_train)
                print(clf.__class__.__name__, tk.second - t0, clf.score(x_test, y_test))


experiment()

CNN、GRU、LSTM、双向GRU、双向LSTM

from keras.utils import to_categorical
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, LSTM, GRU, Bidirectional, Conv1D, MaxPool1D, GlobalMaxPool1D, Embedding
from keras.callbacks import EarlyStopping
from sklearn.model_selection import train_test_split
import collections, warnings
from segment import tk, clean
from data10 import load_xy
warnings.filterwarnings('ignore')

"""配置"""
N = 25000  # 最大词数
input_dim = N + 1  # 词库大小
output_dim = 150  # 词嵌入维度
kernel_size = 7  # 卷积核大小
units = filters = 64  # RNN神经元数量、卷积滤波器数量
maxlen = 200  # 序列长度
batch_size = 128  # 每批数据量大小
epochs = 999  # 训练最大轮数
verbose = 2  # 训练过程展示
patience = 1  # 没有进步的训练轮数
callbacks = [EarlyStopping('val_acc', patience=patience)]
DISCARD_FLAG = {'c', 'd', 'e', 'o', 'p', 'r', 'u', 'uv', 'y', 'NUM'}
C = ['science', 'car', 'finance', 'sports', 'military', 'medicine', 'entertainment', 'politics', 'education', 'fashion']
num_classes = len(C)


def cut1(text):
    for clause in clean.SEP45(text):
        for word in tk.cut(clause):
            if tk.get_flag(word) not in DISCARD_FLAG:
                yield word


"""读数据"""
x, (x1, x2, y1, y2) = load_xy()
y1 = to_categorical([C.index(i) for i in y1], num_classes)
y2 = to_categorical([C.index(i) for i in y2], num_classes)
# 词编码
w2i = {wf[0]: e for e, wf in enumerate(collections.Counter(w for t in x for w in cut1(t)).most_common(N), 1)}
# pad
x1 = pad_sequences([[w2i[w] for w in cut1(t) if w in w2i] for t in x1], maxlen, dtype='float')
x2 = pad_sequences([[w2i[w] for w in cut1(t) if w in w2i] for t in x2], maxlen, dtype='float')
# 验证集切分
validation_size = .1
x11, x12, y11, y12 = train_test_split(x1, y1, test_size=validation_size)


def experiment():
    for layer, layer_name in (
        (LSTM(units), 'LSTM'),
        (GRU(units), 'GRU'),
        (Bidirectional(LSTM(units)), 'BiLSTM'),
        (Bidirectional(GRU(units)), 'BiGRU'),
    ):
        tk.cyan(layer_name)
        # 建模
        model = Sequential()
        model.add(Embedding(input_dim, output_dim, input_length=maxlen, input_shape=(maxlen,)))
        model.add(layer)
        model.add(Dense(units=num_classes, activation='softmax'))
        model.compile('adam', 'categorical_crossentropy', ['acc'])
        # 训练、预测
        history = model.fit(x11, y11, batch_size, epochs, verbose, callbacks, validation_data=(x12, y12))
        e = len(history.history['acc'])
        print(model.evaluate(x2, y2, batch_size, verbose), e)
        # 验证集加入训练、预测
        model.fit(x12, y12, batch_size, int(e * validation_size) + 1, verbose, callbacks)
        tk.yellow(model.evaluate(x2, y2, batch_size, verbose))
    # CNN
    tk.cyan('CNN')
    model = Sequential()
    model.add(Embedding(input_dim, output_dim, input_length=maxlen, input_shape=(maxlen,)))
    model.add(Conv1D(units, kernel_size * 2, padding='same', activation='relu'))
    model.add(MaxPool1D(pool_size=2))  # strides默认等于pool_size
    model.add(Conv1D(units * 2, kernel_size, padding='same', activation='relu'))
    model.add(GlobalMaxPool1D())  # 对于时序数据的全局最大池化
    model.add(Dense(num_classes, activation='softmax'))
    model.compile('adam', 'categorical_crossentropy', ['acc'])
    # 训练、预测
    history = model.fit(x11, y11, batch_size, epochs, verbose, callbacks, validation_data=(x12, y12))
    e = len(history.history['acc'])
    print(model.evaluate(x2, y2, batch_size, verbose), e)
    # 验证集加入训练、预测
    model.fit(x12, y12, batch_size, int(e * validation_size) + 1, verbose, callbacks)
    tk.yellow(model.evaluate(x2, y2, batch_size, verbose))


experiment()

词向量+【CNN、GRU、LSTM、双向GRU、双向LSTM】

from gensim.models import Word2Vec
from keras.utils import to_categorical
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, LSTM, GRU, Bidirectional, Conv1D, MaxPool1D, GlobalMaxPool1D
from keras.callbacks import EarlyStopping
from sklearn.model_selection import train_test_split
import numpy as np, warnings
from math import log10
from segment import tk, clean
from data10 import load_xy
warnings.filterwarnings('ignore')

"""配置"""
size = 150  # 词向量维度
window = kernel_size = 7  # 词窗、卷积核大小
units = filters = 64  # RNN神经元数量、卷积滤波器数量
maxlen = 200  # 序列长度
batch_size = 128  # 每批数据量大小
epochs = 999  # 训练最大轮数
verbose = 2  # 训练过程展示
patience = 1  # 没有进步的训练轮数
callbacks = [EarlyStopping('val_acc', patience=patience)]
DISCARD_FLAG = {'c', 'd', 'e', 'o', 'p', 'r', 'u', 'uv', 'y', 'NUM'}
C = ['science', 'car', 'finance', 'sports', 'military', 'medicine', 'entertainment', 'politics', 'education', 'fashion']
num_classes = len(C)


def cut1(text):
    for word in tk.cut(text):
        if tk.get_flag(word) not in DISCARD_FLAG:
            yield word


"""读数据"""
x, (x1, x2, y1, y2) = load_xy()
y1 = to_categorical([C.index(i) for i in y1], num_classes)
y2 = to_categorical([C.index(i) for i in y2], num_classes)

"""词向量"""
sentences = [list(cut1(s)) for t in x for s in clean.text2clause(t)]  # 文本切分
wv = Word2Vec(sentences, size=size, window=window, min_count=3, sg=1).wv
vectors = wv.vectors
texts = [set(cut1(t)) for t in x]
lent = len(texts)
vectors = vectors * np.array([[log10(lent / (sum((w in t) for t in texts) + 1))] for w in wv.index2word])  # idf
w2i = {w: i for i, w in enumerate(wv.index2word)}
# pad
x1 = pad_sequences([[vectors[w2i[w]] for w in cut1(t) if w in w2i] for t in x1], maxlen, dtype='float')
x2 = pad_sequences([[vectors[w2i[w]] for w in cut1(t) if w in w2i] for t in x2], maxlen, dtype='float')
# 验证集切分
validation_size = .1
x11, x12, y11, y12 = train_test_split(x1, y1, test_size=validation_size)


def experiment():
    for layer, layer_name in (
        (LSTM(units), 'LSTM'),
        (GRU(units), 'GRU'),
        (Bidirectional(LSTM(units), input_shape=(maxlen, size)), 'BiLSTM'),
        (Bidirectional(GRU(units), input_shape=(maxlen, size)), 'BiGRU'),
    ):
        tk.cyan(layer_name)
        # 建模
        model = Sequential()
        model.add(layer)
        model.add(Dense(units=num_classes, activation='softmax'))
        model.compile('adam', 'categorical_crossentropy', ['acc'])
        # 训练、预测
        history = model.fit(x11, y11, batch_size, epochs, verbose, callbacks, validation_data=(x12, y12))
        e = len(history.history['acc'])
        print(model.evaluate(x2, y2, batch_size, verbose), e)
        # 验证集加入训练、预测
        model.fit(x12, y12, batch_size, int(e * validation_size) + 1, verbose, callbacks)
        tk.yellow(model.evaluate(x2, y2, batch_size, verbose))
    # CNN
    tk.cyan('CNN')
    model = Sequential()
    model.add(Conv1D(units, kernel_size * 2, padding='same', activation='relu'))
    model.add(MaxPool1D(pool_size=2))  # strides默认等于pool_size
    model.add(Conv1D(units * 2, kernel_size, padding='same', activation='relu'))
    model.add(GlobalMaxPool1D())  # 对于时序数据的全局最大池化
    model.add(Dense(num_classes, activation='softmax'))
    model.compile('adam', 'categorical_crossentropy', ['acc'])
    # 训练、预测
    history = model.fit(x11, y11, batch_size, epochs, verbose, callbacks, validation_data=(x12, y12))
    tk.yellow(model.evaluate(x2, y2, batch_size, verbose))
    # 验证集加入训练、预测
    model.fit(x12, y12, batch_size, len(history.history['acc']) - 1, verbose, callbacks)
    tk.yellow(model.evaluate(x2, y2, batch_size, verbose))


experiment()

无监督

词向量+预设规则

from gensim.models import Word2Vec
from collections import Counter
from segment import tk, clean

DISCARD_FLAG = {'c', 'd', 'e', 'o', 'p', 'r', 'u', 'uv', 'y', 'NUM'}  # 词性排除
THRESHOLD = .5


def cut(text):
    for word in tk.cut(text):
        if tk.get_flag(word) not in DISCARD_FLAG:
            yield word


def texts2sentences(texts):
    return [list(cut(s)) for t in texts for s in clean.text2clause(t)]


class Model:
    def __init__(self, texts, keywords, themes):
        # 加入词库
        for word in keywords:
            tk.add_word(word)
        # 训练词向量
        self.wv = Word2Vec(texts2sentences(texts), window=11, sg=1).wv
        # 词库扩展
        self.dt = {w: {w: 1} for w in keywords}
        for word in keywords:
            for w, s in self.wv.similar_by_word(word, 99):
                if s < THRESHOLD:
                    break
                self.dt[w] = dict({word: s ** 2}, **self.dt.get(w, dict()))
        print(self.dt)
        self.themes = themes

    def ner(self, text):
        # 抽取扩展后的关键词
        c1 = Counter(w for w in cut(text) if w in self.dt)
        # 扩展后的关键词映射到原关键词
        c2 = Counter()
        for k1, v1 in c1.items():
            for k2, v2 in self.dt[k1].items():
                c2[k2] += v1 * v2
        return c2.most_common()

    def extract_theme(self, text):
        themes = Counter()
        for w, f in self.ner(text):
            themes[self.themes[w]] += f
        return themes and themes.most_common()[0][0]


# 读数据
from pandas import read_excel
ay = read_excel('data10/data10.xlsx').values
x, y = ay[:, 0], ay[:, 1]
WORDS = {
    '车': 'car', '车型': 'car', '汽车': 'car',
    '教育': 'education', '学生': 'education', '学校': 'education', '考生': 'education',
    '娱乐': 'entertainment', '观众': 'entertainment', '饰演': 'entertainment', '演员': 'entertainment',
    '电影': 'entertainment', '角色': 'entertainment', '影片': 'entertainment', '导演': 'entertainment',
    '肌肤': 'fashion', '时尚': 'fashion', '搭配': 'fashion', '穿': 'fashion', '裙': 'fashion',
    '珠宝': 'fashion', '装修': 'fashion', '保湿': 'fashion', '时髦': 'fashion', '面膜': 'fashion', '香水': '时尚',
    '比赛': 'sports', '球队': 'sports', '队': 'sports', '球员': 'sports', '体育': 'sports', '赛季': 'sports',
    '症状': 'medicine', '治疗': 'medicine', '临床': 'medicine',
    '疾病': 'medicine', '患者': 'medicine', '综合征': 'medicine',
    '科技': 'science', '研究': 'science', 'iPhone': 'science', '手机': 'science',
}
# 算法
model = Model(x, WORDS.keys(), WORDS)
y_predict = [model.ner(i) for i in x]
print(sum(y == y_predict) / len(y))
while True:
    try:
        x = x[int(input('输入数字').strip())]
        print(x, '\n\033[033m{}\033[0m'.format(model.ner(x)))
    except:
        pass

主题模型

LDA是垃圾
LDA是垃圾
LDA是垃圾
LDA是垃圾
LDA是垃圾
LDA是垃圾
LDA是垃圾
主题模型是垃圾
主题模型是垃圾
主题模型是垃圾
主题模型是垃圾
主题模型是垃圾
主题模型是垃圾
主题模型是垃圾
主题模型是垃圾

from gensim import corpora, models
from segment import tk, clean
import numpy as np

DISCARD_FLAG = {'a', 'ad', 'c', 'd', 'e', 'f', 'i', 'l', 'nb', 'm', 'o', 'p', 'r', 'u', 'uv', 'y', 'NUM', 'NA'}


def cut(text):
    for clause in clean.text2clause(text):
        for word in tk.cut(clause):
            if (tk.get_flag(word) not in DISCARD_FLAG) and (len(word) > 1):
                yield word


def experiment(texts, themes):
    words_ls = [list(cut(t)) for t in texts]
    # 构造词典
    dictionary = corpora.Dictionary(words_ls)
    # 基于词典,使【词】→【稀疏向量】,并将向量放入列表,形成【稀疏向量集】
    corpus = [dictionary.doc2bow(words) for words in words_ls]
    # lda模型,num_topics设置主题的个数
    lda = models.ldamodel.LdaModel(corpus=corpus, num_topics=10, id2word=dictionary)
    # 打印所有主题,每个主题显示20个词
    topics = lda.print_topics(num_words=20)
    for topic in topics:
        print(topic)
    # 主题对应编号(手动输入)
    dt = dict()
    _themes = ['science', 'car', 'finance', 'sports', 'military', 'medicine',
               'entertainment', 'politics', 'education', 'fashion']
    for i in range(10):
        print(topics[i])
        j = int(input('{}'.format([k for k in enumerate(_themes)])).strip())
        dt[i] = _themes[j]
        del _themes[j]

    # 主题推断
    inference = np.argmax(lda.inference(corpus)[0], axis=1)
    inference = [dt[i] for i in inference]
    print(np.mean(themes == inference))


# 读数据
from pandas import read_excel
ay = read_excel('data10/data10.xlsx').values
x, y = ay[:, 0], ay[:, 1]
experiment(x, y)

实验结果和结论

  • 逻辑回归整体最优(最高准度第2,平均准度第1,结果稳定,速度ok)
  • 独热编码优于词向量
  • 独热编码tfidf优于count
  • 线性svm训练时间过长,结果不稳定
  • 独热tfidf+线性svm准度最优
  • 深度学习的训练轮数不易确认,导致不稳定
  • 数据量较少情况下深度学习的准确度较机器学习低
  • 词向量相当于降维,低维空间上,逻辑回归和线性SVM效果一般,高斯核函数SVM效果更好但不稳定
  • 无监督学习中,【词向量+专家系统】有76%的准确率
  • 主题模型是垃圾!LDA是垃圾LDA是垃圾LDA是垃圾LDA是垃圾LDA是垃圾LDA是垃圾
机器学习入门课程(2)—— 分类问题(决策树、贝叶斯、VSM、逻辑回归、集成学习) 分类问题 分类问题是监督学习的一个核心问题,它从数据中学习一个分类决策函数或分类模型(分类器),对新的输入进行输出预测,输出变量取有限个离散值。 包括二分类问题/多分类问题。 算法:决策树、贝叶斯、支持向量机SVM、逻辑回归 一 决策树 决策树:树结构,每个非叶节点表示一个特征属性,每个分支边代表这个特征属性在某个值域上的输出,每个叶节点存放一个类别。 决策过程:从根节点开始,测试待分类项中... 阅读详情

相关推荐

机器学习实验四:贝叶斯分类器

实验数据为来自 UCI 的鸢尾花三分类数据集 Iris Plants Database。数据集共包含 150 组数据,分为 3 类,每类 50 组数据。每组数据包括 4 个参数和 1 个分类标签,4 个参数分别为:萼片长度 sepal length、萼片宽度 sepalwidth、花瓣长度 petal length、花瓣宽度 petal width,单位均为厘米。分类标签共有三种,分别为 Iris Setosa、Iris Versicolour 和 Iris Virginica。

magic171的博客 2659

【原创首发】训练集停止训练后,验证集加入训练(在深度学习算法中)

在深度学习中,为了防止过拟合,被切分出来的验证集用来停止训练,但木有用于训练而导致浪费 本文尝试训练集停止训练后,验证集加入训练,并用多组参数进行实验 图像识别结果有提升,非常不稳定但可控,建议在选择10%作为验证集并在训练结束后加入至少1次 文本分类结果有明显提升,不稳定但可控 无论哪种分类,训练集结束后,进行至少一轮验证集,极高概率提升模型准确率

ArYe 2029

如何设置在交叉验证中同时设置训练集,验证集,测试集三个数据集并实现循环

传统的交叉验证 在做机器学习时,交叉验证时验证模型稳定性的重要手段。大部分交叉验证仅分为训练集和测试集,每次循环一次,直至覆盖所有数据。这个可以采用sklern中cross_validiation_score 直接运行,如: 该方法的缺点之一是只能拆分成训练集和测试集,当需要验证集来调参数时,无验证集可用。 先划分测试集,但不循环 实现训练集,测试集,和验证集的一个方法时在训练数据前分割数据,取...

XH生信和机器学习空间 2341

训练集、测试集与验证集的含义

训练集、测试集与验证集的含义 1. 定义 (1)在数据量(及标签)很充足的情况下: 如果我们自己已经有了一个大的标注数据集,想要完成一个有监督模型的测试,那么通常使用均匀随机抽样的方式,将数据集划分为训练集、验证集、测试集,这三个集合不能有交集,三个集合符合同分布。常见的比例是可以上网看看。 (2)在数据量(及标签)很少的情况下: 比如在做比赛时,官方只提供了一个标注的数据集(作为训练集)以及一个...

gongliming_的博客 3622

基于决策树、SVM的手写字分类

数字识别是文字识别的一种分类。手写数字的识别是模式识别及机器学习的一个重要应用,应用范围非常广泛。数字识别可以应用在大规模数据统计中,例如人口普查,以前完全靠手工输入,很耗费人力物力,如果用计算机能自动化识别将减少人力财力。

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 1186

告别安装烦恼!Orange3 3.38.0 Windows绿色版下载即用,附保姆级汉化与组件配置指南

本文详细介绍了Orange3 3.38.0 Windows绿色版的下载与使用,包括中文汉化、组件配置及高效管理技巧。这款无需安装的数据科学工具特别适合快速验证想法的研究人员和移动办公用户,支持多种数据源和可视化工具,大幅提升工作效率。

weixin_30897233的博客 606

训练集、验证集、测试集以及交验验证的理解

在人工智能机器学习中,很容易将“验证集”与“测试集”,“交叉验证”混淆。 一、三者的区别 训练集(train set) —— 用于模型拟合的数据样本。 验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 在神经网络中, 我们用验证数据集去寻找最优的网络深度(nu...

kieven2008的专栏 20万+

STM32+OV7670实战:5步搞定低成本人脸识别门禁系统(附完整代码)

本文详细介绍了基于STM32单片机和OV7670摄像头构建低成本离线人脸识别门禁系统的完整实战方案。文章从硬件选型、电路设计避坑入手,逐步讲解了图像采集优化、轻量级人脸检测与LBP特征提取策略,并提供了离线人脸库管理、特征比对以及系统集成的具体实现方法,附有核心代码示例,旨在帮助开发者快速实现可落地的嵌入式视觉应用。

kubernetes8ctl的博客 568

Python机器学习:从零基础到项目实战

当您翻开此书,您正踏入一场数据与智慧的修行。机器学习,并非冰冷的符码,而是机器模拟人类洞察世界的法门。本书将带您,以Python为舟,泛游于算法之海。我们不只传授“术”,更探求其后的“道”——从数据的生灭流转中观照规律,于模型的迭代演进里体悟得失。愿您合上书卷时,收获的不仅是驾驭数据的技能,更有一双洞悉复杂、化繁为简的“智慧之眼”。现在,让我们一同启程。

YunWisdom 972

省一蓝桥杯嵌入式-09RTC实时时钟

RTC(Real-Time Clock)实时时钟,是一个独立的定时器RTC模块拥有一组连续的计数的计数器,在响应软件配置下,可提供时钟、日历、闹钟功能RTC能提供年月日时分秒等信息(可设置)在系统复位或从待机模式唤醒后,RTC的设置时间维持不变(这个我没实现,复位后时间也重置了,有能力的可以自己研究一下)持续时间跟踪:在主系统断电后或处于低功耗模式时,RTC仍继续工作,原理是有额外的电池为其供电(蓝桥杯板子没有这个备用电源,该功能无效。

qq_46392331的博客 1729

VTK的编译和部署,配合c++和visual studio2022,VTK开发环境的配置

在官网选择最新的版本下载之后进行解压,然后再里面创建build目录,方便后面使用cmake进行编译。

dz131lsq的博客 3223

pytorch神经网络学习笔记04----包含训练集、验证集、测试集的过程代码

包含训练集、验证集、测试集的模板代码

方脸大公鸡的博客 3930

【系统架构设计师-2023年真题】综合知识-答案及详解

要实现多任务间的协同工作,操作系统必须提供任务间的通信手段。嵌入式操作系统一般都会提供多任务间通信的方法,其中()是任务间最直接、最明显的通信方法,也是访问共享的数据结构,即不同的任务都可以访问同一地址空间。()作为一种更高级的通信方式,能够在同一处理器的各个任务间传递任意长度(理论上只受物理内存和机器字长限制)的信息。(1)A. 共享内存 B. Socket C. 消息传递 D. 信号量(2)A. 共享内存 B. Socket C. 消息传递 D. 信号量【答案】A、C关于星型拓扑结构,下列说法正确的是(

数据知道的博客 1万+

训练集,验证集,测试集(以及为什么要使用验证集?)(Training Set, Validation Set, Test Set)

对于训练集,验证集,测试集的概念,很多人都搞不清楚。网上的文章也是鱼龙混杂,因此,现在来把这方面的知识梳理一遍。让我们先来看一下模型验证(评估)的几种方式。 在机器学习中,当我们把模型训练出来以后,该怎么对模型进行验证呢?(也就是说怎样知道训练出来的模型好不好?)有以下几种验证方式: 第一种方式:把数据集全部作为训练集,然后用训练集训练模型,用训练集验证模型(如果有多个模型需要进行选择,那么最后选出训练误差最小的那个模型作为最好的模型) 这种方式显然不可行,因此训练集数据已经在模型拟合时使..

jinchenpeng的博客 2万+

运放比较电路分析以及应用

摘要:本文介绍了基于LM321运放的同相输入型单限电压比较器电路。该电路通过运放开环工作模式实现电平判断:当输入信号Vs+>0V时输出+15V高电平,Vs+<0V时输出≈0V低电平。典型应用包括直流电压过零检测、交流信号整形、电池欠压报警和数字信号噪声过滤。电路具有结构简单(仅需1个运放和1个电阻)、成本低的优势,适用于传感器信号处理、波形转换等场景。使用时需注意参考电平调整、输出电平匹配等问题,如需抗噪声可增加正反馈电阻构成施密特触发器。该电路是运放实现简单电平逻辑的经典方案。

qq_37999850的博客 402

uni-app 实现高德 / 百度 / 腾讯地图多端导航跳转(H5最全方案)

本文介绍了一套生产级可复用的多地图导航Hook封装方案。针对开发中常见的经纬度顺序混乱、中文乱码、参数不统一等问题,提供了统一解决方案。方案支持高德、百度、腾讯三大地图平台,封装了各平台的URI参数处理逻辑,包括坐标顺序转换、名称编码、导航模式适配等核心功能。通过组合式API设计,开发者只需调用统一入口即可实现多地图导航跳转,同时保留单独调用各平台的能力。文中还总结了6大常见坑点,并推荐默认使用高德地图作为最稳定的导航方案。该方案适用于车辆定位、物流配送等多种业务场景,可封装为可复用的Hooks组件。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 538

Python 分类问题研究-朴素贝叶斯模型

【实验目的】 1.掌握常见机器学习分类模型思想、算法,包括Fisher线性判别、KNN、朴素贝叶斯、Logistic回归、决策树等; 2.掌握Python编程实现分类问题,模型评价指标、计时功能、保存模型。 【实验要求】 理解Python在分类问题中的评价指标等细节操作; 掌握本章讲授的分类问题的Python编程操作。 【实验过程】(必要的实验步骤、绘图、代码注释、数据分析) 实验步骤 1、读入数据 2、数据预处理 3、数据分析方法介绍 4、编程实现数据分析方法,含代码注释 5、重要结果的图表绘制 6、

gezongbo的博客 1142

Pytorch入门实战(7):基于BERT实现文本隐喻二分类(Kaggle入门题目)

Bert入门实战,文本二分类问题

iioSnail的博客 4059

python机器学习——分类模型评估 & 分类算法(k近邻,朴素贝叶斯,决策树,随机森林,逻辑回归,svm)

分类模型评估 & 分类算法(k近邻,朴素贝叶斯,决策树,随机森林,逻辑回归,svm)

Arya的博客,专注后端领域 6535

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

python零基础做机器学习实验(决策树/朴素贝叶斯/神经网络/支持向量机/随机森林/判别分析)

import numpy as np import pandas as pd from sklearn import tree from sklearn.naive_bayes import GaussianNB from sklearn.neural_network import MLPClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC from sklearn.gaussian

情不知所起一往而深 3万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

验证集混入训练数据:我的深度学习入门课救回了99%准确率的假象

当我把验证集混入训练数据时,测试准确率高达99%的模型上线就崩。通过亚马逊云科技深度学习入门课程,才明白数据隔离的核心原则。分享从数据拆分到线上监控的全套修正方案,适合正在入门AI开发的工程师避坑。

weixin_47315004的博客 15

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

(五)训练过程中加入验证过程

计算准确率加入计算图中,在会话中,喂的数据集是验证数据集,可以设置每200步验证一次。注:无论是训练集还是验证集,准确率都是得到的一个batch的。 ...

like_study_cat的博客 975

手写数字识别:基于决策树算法,KNN算法,支持向量机(SVM)算法与卷积神经网络(CNN)算法

998年,美国国家标准技术研究所(NIST)发布了MNIST数据集,这是一个用来训练各种图像处理系统的二进制图像数据集,广泛应用于机器学习中的训练和测试。MNIST数据集是从NIST的两个手写数字数据集:Special Database 3 和Special Database 1中分别取出部分图像,并经过一些图像处理后得到的。MNIST数据集共有70000张图像,其中训练集60000张,测试集10000张。所有图像都是28×28的灰度图像,每张图像包含一个手写数字。

huiyiiiiii的博客 4098

机器学习—朴素贝叶斯进行文本分类

一、贝叶斯决策理论     给定一个点(x,y)要决定属于哪一个类别(类别1,类别2) 我们一般的处理方法是:     如果:P1(x,y)>P2(x,y) 类别为1     如果:P2(x,y)>P1(x,y) 类别为2       这就是贝叶斯决策理论的核心思想——选择具有最高概率的决策。   二、条件概率     条件概率P(a|b)表示在事件b已经发生的情况下事件a出

潘安 BLOGS 797

朴素贝叶斯之自然语言语义分析(一):简单文本主题分类→手撕文本特征向量化

1、需求说明 (1)经验样本数据: docid,label,doc doc0,1,苹果 官网 苹果 宣布 骁龙 安卓 doc1,0,苹果 梨 香蕉 桔子 肥料 甜度 doc2,0,苹果 梨 桔子 保鲜 甜度 doc3,1,苹果 科技 手机 官网 宣布 安卓 骁龙 (2)对下面的未知类别文档做分类预测: docid,doc doc1,苹果 香蕉 甜度 doc2,苹果 手机 安卓 骁龙 2、难点分...

IT_但丁的博客 916

自然语言处理入门:用Python实现文本分类与情感分析

自然语言处理(NLP)是人工智能的关键分支,旨在使计算机理解和生成人类语言。文本分类和情感分析是NLP中的两个核心任务,广泛应用于垃圾邮件检测、新闻分类和情感分析等领域。Python因其丰富的库和框架,成为NLP初学者的理想选择。本文详细介绍了如何使用Python实现文本分类和情感分析,包括基本概念、应用场景、Python基础、数据预处理、模型选择与训练、模型评估等步骤。通过实战案例,展示了从数据准备到模型评估的完整流程,为读者提供了从理论到实践的全面指导。

2501_91624122的博客 1275
上一篇: 【原创首发】训练集停止训练后,验证集加入训练(在深度学习算法中)
下一篇: 程序员的金融笔记:经济学原理-微观经济学-曼昆-第7版
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值