当前位置: 首页 > 编程日记 > 正文

万字长文总结机器学习的模型评估与调参 | 附代码下载

作者 | Sebastian Raschka

翻译&整理 | Sam

来源 | SAMshare

目录

一、认识管道流

1.1 数据导入

1.2 使用管道创建工作流

二、K折交叉验证

2.1 K折交叉验证原理

2.2 K折交叉验证实现

三、曲线调参

3.1 模型准确度

3.2 绘制学习曲线得到样本数与准确率的关系

3.3 绘制验证曲线得到超参和准确率关系

四、网格搜索

4.1 两层for循环暴力检索

4.2 构建字典暴力检索

五、嵌套交叉验证

六、相关评价指标

6.1 混淆矩阵及其实现

6.2 相关评价指标实现

6.3 ROC曲线及其实现

认识管道流

今天先介绍一下管道工作流的操作。

“管道工作流”这个概念可能有点陌生,其实可以理解为一个容器,然后把我们需要进行的操作都封装在这个管道里面进行操作,比如数据标准化、特征降维、主成分分析、模型预测等等,下面还是以一个实例来讲解。

1.1 数据导入与预处理

本次我们导入一个二分类数据集 Breast Cancer Wisconsin,它包含569个样本。首列为主键ID,第2列为类别值(M=恶性肿瘤,B=良性肿瘤),第3-32列是实数值的特征。

先导入数据集:

 1# 导入相关数据集2import pandas as pd3import urllib4try:5    df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases'6                     '/breast-cancer-wisconsin/wdbc.data', header=None)7except urllib.error.URLError:8    df = pd.read_csv('https://raw.githubusercontent.com/rasbt/'9                     'python-machine-learning-book/master/code/'
10                     'datasets/wdbc/wdbc.data', header=None)
11print('rows, columns:', df.shape)
12df.head()

使用我们学习过的LabelEncoder来转化类别特征:

1from sklearn.preprocessing import LabelEncoder
2X = df.loc[:, 2:].values
3y = df.loc[:, 1].values
4le = LabelEncoder()
5# 将目标转为0-1变量
6y = le.fit_transform(y)
7le.transform(['M', 'B'])

划分训练验证集:

1## 创建训练集和测试集
2from sklearn.model_selection import train_test_split
3X_train, X_test, y_train, y_test = \
4    train_test_split(X, y, test_size=0.20, random_state=1)

1.2 使用管道创建工作流

很多机器学习算法要求特征取值范围要相同,因此需要对特征做标准化处理。此外,我们还想将原始的30维度特征压缩至更少维度,这就需要用到主成分分析,要用PCA来完成,再接着就可以进行logistic回归预测了。

Pipeline对象接收元组构成的列表作为输入,每个元组第一个值作为变量名,元组第二个元素是sklearn中的transformer或Estimator。管道中间每一步由sklearn中的transformer构成,最后一步是一个Estimator。

本次数据集中,管道包含两个中间步骤:StandardScaler和PCA,其都属于transformer,而逻辑斯蒂回归分类器属于Estimator。

本次实例,当管道pipe_lr执行fit方法时:

1)StandardScaler执行fit和transform方法;

2)将转换后的数据输入给PCA;

3)PCA同样执行fit和transform方法;

4)最后数据输入给LogisticRegression,训练一个LR模型。

对于管道来说,中间有多少个transformer都可以。管道的工作方式可以用下图来展示(一定要注意管道执行fit方法,而transformer要执行fit_transform):

上面的代码实现如下:

 1from sklearn.preprocessing import StandardScaler # 用于进行数据标准化2from sklearn.decomposition import PCA # 用于进行特征降维3from sklearn.linear_model import LogisticRegression # 用于模型预测4from sklearn.pipeline import Pipeline5pipe_lr = Pipeline([('scl', StandardScaler()),6                    ('pca', PCA(n_components=2)),7                    ('clf', LogisticRegression(random_state=1))])8pipe_lr.fit(X_train, y_train)9print('Test Accuracy: %.3f' % pipe_lr.score(X_test, y_test))
10y_pred = pipe_lr.predict(X_test)

Test Accuracy: 0.947

K折交叉验证

为什么要评估模型的泛化能力,相信这个大家应该没有疑惑,一个模型如果性能不好,要么是因为模型过于复杂导致过拟合(高方差),要么是模型过于简单导致导致欠拟合(高偏差)。如何评估它,用什么数据来评估它,成为了模型评估需要重点考虑的问题。

我们常规做法,就是将数据集划分为3部分,分别是训练、测试和验证,彼此之间的数据不重叠。但,如果我们遇见了数据量不多的时候,这种操作就显得不太现实,这个时候k折交叉验证就发挥优势了。

2.1 K折交叉验证原理

先不多说,先贴一张原理图(以10折交叉验证为例)。

k折交叉验证步骤:

Step 1:使用不重复抽样将原始数据随机分为k份;

Step 2:其中k-1份数据用于模型训练,剩下的那1份数据用于测试模型;

Step 3:重复Step 2 k次,得到k个模型和他的评估结果。

Step 4:计算k折交叉验证结果的平均值作为参数/模型的性能评估。

2.1 K折交叉验证实现

K折交叉验证,那么K的取值该如何确认呢?一般我们默认10折,但根据实际情况有所调整。我们要知道,当K很大的时候,你需要训练的模型就会很多,这样子对效率影响较大,而且每个模型的训练集都差不多,效果也差不多。我们常用的K值在5~12。

我们根据k折交叉验证的原理步骤,在sklearn中进行10折交叉验证的代码实现:

 1import numpy as np2from sklearn.model_selection import StratifiedKFold3kfold = StratifiedKFold(n_splits=10,4                            random_state=1).split(X_train, y_train)5scores = []6for k, (train, test) in enumerate(kfold):7    pipe_lr.fit(X_train[train], y_train[train])8    score = pipe_lr.score(X_train[test], y_train[test])9    scores.append(score)
10    print('Fold: %s, Class dist.: %s, Acc: %.3f' % (k+1,
11          np.bincount(y_train[train]), score))
12print('\nCV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))

output:

当然,实际使用的时候没必要这样子写,sklearn已经有现成封装好的方法,直接调用即可。

1from sklearn.model_selection import cross_val_score
2scores = cross_val_score(estimator=pipe_lr,
3                         X=X_train,
4                         y=y_train,
5                         cv=10,
6                         n_jobs=1)
7print('CV accuracy scores: %s' % scores)
8print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))

曲线调参

我们讲到的曲线,具体指的是学习曲线(learning curve)和验证曲线(validation curve)。

3.1 模型准确率(Accuracy)

模型准确率反馈了模型的效果,大家看下图:

1)左上角子的模型偏差很高。它的训练集和验证集准确率都很低,很可能是欠拟合。解决欠拟合的方法就是增加模型参数,比如,构建更多的特征,减小正则项。

2)右上角子的模型方差很高,表现就是训练集和验证集准确率相差太多。解决过拟合的方法有增大训练集或者降低模型复杂度,比如增大正则项,或者通过特征选择减少特征数。

3)右下角的模型就很好。

3.2 绘制学习曲线得到样本数与准确率的关系

直接上代码:

 1import matplotlib.pyplot as plt2from sklearn.model_selection import learning_curve3pipe_lr = Pipeline([('scl', StandardScaler()),4                    ('clf', LogisticRegression(penalty='l2', random_state=0))])5train_sizes, train_scores, test_scores =\6                learning_curve(estimator=pipe_lr,7                               X=X_train,8                               y=y_train,9                               train_sizes=np.linspace(0.1, 1.0, 10), #在0.1和1间线性的取10个值
10                               cv=10,
11                               n_jobs=1)
12train_mean = np.mean(train_scores, axis=1)
13train_std = np.std(train_scores, axis=1)
14test_mean = np.mean(test_scores, axis=1)
15test_std = np.std(test_scores, axis=1)
16plt.plot(train_sizes, train_mean,
17         color='blue', marker='o',
18         markersize=5, label='training accuracy')
19plt.fill_between(train_sizes,
20                 train_mean + train_std,
21                 train_mean - train_std,
22                 alpha=0.15, color='blue')
23plt.plot(train_sizes, test_mean,
24         color='green', linestyle='--',
25         marker='s', markersize=5,
26         label='validation accuracy')
27plt.fill_between(train_sizes,
28                 test_mean + test_std,
29                 test_mean - test_std,
30                 alpha=0.15, color='green')
31plt.grid()
32plt.xlabel('Number of training samples')
33plt.ylabel('Accuracy')
34plt.legend(loc='lower right')
35plt.ylim([0.8, 1.0])
36plt.tight_layout()
37plt.show()

Learning_curve中的train_sizes参数控制产生学习曲线的训练样本的绝对/相对数量,此处,我们设置的train_sizes=np.linspace(0.1, 1.0, 10),将训练集大小划分为10个相等的区间,在0.1和1之间线性的取10个值。learning_curve默认使用分层k折交叉验证计算交叉验证的准确率,我们通过cv设置k。

下图可以看到,模型在测试集表现很好,不过训练集和测试集的准确率还是有一段小间隔,可能是模型有点过拟合。

3.3 绘制验证曲线得到超参和准确率关系

验证曲线是用来提高模型的性能,验证曲线和学习曲线很相近,不同的是这里画出的是不同参数下模型的准确率而不是不同训练集大小下的准确率:

 1from sklearn.model_selection import validation_curve2param_range = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]3train_scores, test_scores = validation_curve(4                estimator=pipe_lr, 5                X=X_train, 6                y=y_train, 7                param_name='clf__C', 8                param_range=param_range,9                cv=10)
10train_mean = np.mean(train_scores, axis=1)
11train_std = np.std(train_scores, axis=1)
12test_mean = np.mean(test_scores, axis=1)
13test_std = np.std(test_scores, axis=1)
14plt.plot(param_range, train_mean, 
15         color='blue', marker='o', 
16         markersize=5, label='training accuracy')
17plt.fill_between(param_range, train_mean + train_std,
18                 train_mean - train_std, alpha=0.15,
19                 color='blue')
20plt.plot(param_range, test_mean, 
21         color='green', linestyle='--', 
22         marker='s', markersize=5, 
23         label='validation accuracy')
24plt.fill_between(param_range, 
25                 test_mean + test_std,
26                 test_mean - test_std, 
27                 alpha=0.15, color='green')
28plt.grid()
29plt.xscale('log')
30plt.legend(loc='lower right')
31plt.xlabel('Parameter C')
32plt.ylabel('Accuracy')
33plt.ylim([0.8, 1.0])
34plt.tight_layout()
35plt.show()

我们得到了参数C的验证曲线。和learning_curve方法很像,validation_curve方法使用采样k折交叉验证来评估模型的性能。在validation_curve内部,我们设定了用来评估的参数(这里我们设置C作为观测)。

从下图可以看出,最好的C值是0.1。

网格搜索

网格搜索(grid search),作为调参很常用的方法,这边还是要简单介绍一下。

在我们的机器学习算法中,有一类参数,需要人工进行设定,我们称之为“超参”,也就是算法中的参数,比如学习率、正则项系数或者决策树的深度等。

网格搜索就是要找到一个最优的参数,从而使得模型的效果最佳,而它实现的原理其实就是暴力搜索;即我们事先为每个参数设定一组值,然后穷举各种参数组合,找到最好的那一组。

4.1. 两层for循环暴力检索

网格搜索的结果获得了指定的最优参数值,c为100,gamma为0.001

 1# naive grid search implementation2from sklearn.datasets import load_iris3from sklearn.svm import SVC4from sklearn.model_selection import train_test_split5iris = load_iris()6X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)7print("Size of training set: %d   size of test set: %d" % (X_train.shape[0], X_test.shape[0]))8best_score = 09for gamma in [0.001, 0.01, 0.1, 1, 10, 100]:
10    for C in [0.001, 0.01, 0.1, 1, 10, 100]:
11        # for each combination of parameters
12        # train an SVC
13        svm = SVC(gamma=gamma, C=C)
14        svm.fit(X_train, y_train)
15        # evaluate the SVC on the test set 
16        score = svm.score(X_test, y_test)
17        # if we got a better score, store the score and parameters
18        if score > best_score:
19            best_score = score
20            best_parameters = {'C': C, 'gamma': gamma}
21print("best score: ", best_score)
22print("best parameters: ", best_parameters)
output:
Size of training set: 112   size of test set: 38
best score:  0.973684210526
best parameters:  {'C': 100, 'gamma': 0.001}

4.2. 构建字典暴力检索

网格搜索的结果获得了指定的最优参数值,c为1

 1from sklearn.svm import SVC2from sklearn.model_selection import GridSearchCV3pipe_svc = Pipeline([('scl', StandardScaler()),4            ('clf', SVC(random_state=1))])5param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]6param_grid = [{'clf__C': param_range, 7               'clf__kernel': ['linear']},8                 {'clf__C': param_range, 9                  'clf__gamma': param_range, 
10                  'clf__kernel': ['rbf']}]
11gs = GridSearchCV(estimator=pipe_svc, 
12                  param_grid=param_grid, 
13                  scoring='accuracy', 
14                  cv=10,
15                  n_jobs=-1)
16gs = gs.fit(X_train, y_train)
17print(gs.best_score_)
18print(gs.best_params_)
output:
0.978021978022
{'clf__C': 0.1, 'clf__kernel': 'linear'}

GridSearchCV中param_grid参数是字典构成的列表。对于线性SVM,我们只评估参数C;对于RBF核SVM,我们评估C和gamma。最后, 我们通过best_parmas_得到最优参数组合。

接着,我们直接利用最优参数建模(best_estimator_):

1clf = gs.best_estimator_
2clf.fit(X_train, y_train)
3print('Test accuracy: %.3f' % clf.score(X_test, y_test))

网格搜索虽然不错,但是穷举过于耗时,sklearn中还实现了随机搜索,使用 RandomizedSearchCV类,随机采样出不同的参数组合。

嵌套交叉验证

嵌套交叉验证(nested cross validation)选择算法(外循环通过k折等进行参数优化,内循环使用交叉验证),对特定数据集进行模型选择。Varma和Simon在论文Bias in Error Estimation When Using Cross-validation for Model Selection中指出使用嵌套交叉验证得到的测试集误差几乎就是真实误差。

嵌套交叉验证外部有一个k折交叉验证将数据分为训练集和测试集,内部交叉验证用于选择模型算法。

下图演示了一个5折外层交叉沿则和2折内部交叉验证组成的嵌套交叉验证,也被称为5*2交叉验证:

我们还是用到之前的数据集,相关包的导入操作这里就省略了。

SVM分类器的预测准确率代码实现:

 1gs = GridSearchCV(estimator=pipe_svc,2                  param_grid=param_grid,3                  scoring='accuracy',4                  cv=2)56# Note: Optionally, you could use cv=2 7# in the GridSearchCV above to produce8# the 5 x 2 nested CV that is shown in the figure.9
10scores = cross_val_score(gs, X_train, y_train, scoring='accuracy', cv=5)
11print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
CV accuracy: 0.965 +/- 0.025

决策树分类器的预测准确率代码实现:

1from sklearn.tree import DecisionTreeClassifier
2
3gs = GridSearchCV(estimator=DecisionTreeClassifier(random_state=0),
4                  param_grid=[{'max_depth': [1, 2, 3, 4, 5, 6, 7, None]}],
5                  scoring='accuracy',
6                  cv=2)
7scores = cross_val_score(gs, X_train, y_train, scoring='accuracy', cv=5)
8print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
CV accuracy: 0.921 +/- 0.029

相关评价指标

6.1 混淆矩阵及其实现

混淆矩阵,大家应该都有听说过,大致就是长下面这样子的:

所以,有几个概念需要先说明:

TP(True Positive): 真实为0,预测也为0

FN(False Negative): 真实为0,预测为1

FP(False Positive): 真实为1,预测为0

TN(True Negative): 真实为1,预测也为1

所以,衍生了几个常用的指标:

: 分类模型总体判断的准确率(包括了所有class的总体准确率)

: 预测为0的准确率

: 真实为0的准确率

: 真实为1的准确率

: 预测为1的准确率

: 对于某个分类,综合了Precision和Recall的一个判断指标,F1-Score的值是从0到1的,1是最好,0是最差

: 另外一个综合Precision和Recall的标准,F1-Score的变形

再举个例子:

混淆矩阵网络上有很多文章,也不用说刻意地去背去记,需要的时候百度一下你就知道,混淆矩阵实现代码:

1from sklearn.metrics import confusion_matrix
2
3pipe_svc.fit(X_train, y_train)
4y_pred = pipe_svc.predict(X_test)
5confmat = confusion_matrix(y_true=y_test, y_pred=y_pred)
6print(confmat)
output:
[[71  1][ 2 40]]
 1fig, ax = plt.subplots(figsize=(2.5, 2.5))2ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)3for i in range(confmat.shape[0]):4    for j in range(confmat.shape[1]):5        ax.text(x=j, y=i, s=confmat[i, j], va='center', ha='center')67plt.xlabel('predicted label')8plt.ylabel('true label')9
10plt.tight_layout()
11plt.show()

6.2 相关评价指标实现

分别是准确度、recall以及F1指标的实现。

1from sklearn.metrics import precision_score, recall_score, f1_score
2
3print('Precision: %.3f' % precision_score(y_true=y_test, y_pred=y_pred))
4print('Recall: %.3f' % recall_score(y_true=y_test, y_pred=y_pred))
5print('F1: %.3f' % f1_score(y_true=y_test, y_pred=y_pred))
Precision: 0.976
Recall: 0.952
F1: 0.964

指定评价指标自动选出最优模型:

可以通过在make_scorer中设定参数,确定需要用来评价的指标(这里用了fl_score),这个函数可以直接输出结果。

 1from sklearn.metrics import make_scorer23scorer = make_scorer(f1_score, pos_label=0)45c_gamma_range = [0.01, 0.1, 1.0, 10.0]67param_grid = [{'clf__C': c_gamma_range,8               'clf__kernel': ['linear']},9              {'clf__C': c_gamma_range,
10               'clf__gamma': c_gamma_range,
11               'clf__kernel': ['rbf']}]
12
13gs = GridSearchCV(estimator=pipe_svc,
14                  param_grid=param_grid,
15                  scoring=scorer,
16                  cv=10,
17                  n_jobs=-1)
18gs = gs.fit(X_train, y_train)
19print(gs.best_score_)
20print(gs.best_params_)
0.982798668208
{'clf__C': 0.1, 'clf__kernel': 'linear'}

6.3 ROC曲线及其实现

如果需要理解ROC曲线,那你就需要先了解一下混淆矩阵了,具体的内容可以查看一下之前的文章,这里重点引入2个概念:

真正率(true positive rate,TPR),指的是被模型正确预测的正样本的比例:

假正率(false positive rate,FPR) ,指的是被模型错误预测的正样本的比例:

ROC曲线概念:

ROC(receiver operating characteristic)接受者操作特征,其显示的是分类器的真正率和假正率之间的关系,如下图所示:

ROC曲线有助于比较不同分类器的相对性能,其曲线下方的面积为AUC(area under curve),其面积越大则分类的性能越好,理想的分类器auc=1。

ROC曲线绘制:

对于一个特定的分类器和测试数据集,显然只能得到一个分类结果,即一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值。

那么如何处理?很简单,我们可以根据模型预测的概率值,并且设置不同的阈值来获得不同的预测结果。什么意思?

比如说:

5个样本,真实的target(目标标签)是y=c(1,1,0,0,1)

模型分类器将预测样本为1的概率p=c(0.5,0.6,0.55,0.4,0.7)

我们需要选定阈值才能把概率转化为类别,如果我们选定阈值为0.1,那么5个样本被分进1的类别。如果选定0.3,结果仍然一样。如果选了0.45作为阈值,那么只有样本4被分进0。


之后把所有得到的所有分类结果计算FTR,PTR,并绘制成线,就可以得到ROC曲线了,当threshold(阈值)取值越多,ROC曲线越平滑。

ROC曲线代码实现:

 1from sklearn.metrics import roc_curve, auc2from scipy import interp34pipe_lr = Pipeline([('scl', StandardScaler()),5                    ('pca', PCA(n_components=2)),6                    ('clf', LogisticRegression(penalty='l2', 7                                               random_state=0, 8                                               C=100.0))])9  
10X_train2 = X_train[:, [4, 14]]
11   # 因为全部特征丢进去的话,预测效果太好,画ROC曲线不好看哈哈哈,所以只是取了2个特征
12
13
14cv = list(StratifiedKFold(n_splits=3, 
15                              random_state=1).split(X_train, y_train))
16
17fig = plt.figure(figsize=(7, 5))
18
19mean_tpr = 0.0
20mean_fpr = np.linspace(0, 1, 100)
21all_tpr = []
22
23for i, (train, test) in enumerate(cv):
24    probas = pipe_lr.fit(X_train2[train],
25                         y_train[train]).predict_proba(X_train2[test])
26
27    fpr, tpr, thresholds = roc_curve(y_train[test],
28                                     probas[:, 1],
29                                     pos_label=1)
30    mean_tpr += interp(mean_fpr, fpr, tpr)
31    mean_tpr[0] = 0.0
32    roc_auc = auc(fpr, tpr)
33    plt.plot(fpr,
34             tpr,
35             lw=1,
36             label='ROC fold %d (area = %0.2f)'
37                   % (i+1, roc_auc))
38
39plt.plot([0, 1],
40         [0, 1],
41         linestyle='--',
42         color=(0.6, 0.6, 0.6),
43         label='random guessing')
44
45mean_tpr /= len(cv)
46mean_tpr[-1] = 1.0
47mean_auc = auc(mean_fpr, mean_tpr)
48plt.plot(mean_fpr, mean_tpr, 'k--',
49         label='mean ROC (area = %0.2f)' % mean_auc, lw=2)
50plt.plot([0, 0, 1],
51         [0, 1, 1],
52         lw=2,
53         linestyle=':',
54         color='black',
55         label='perfect performance')
56
57plt.xlim([-0.05, 1.05])
58plt.ylim([-0.05, 1.05])
59plt.xlabel('false positive rate')
60plt.ylabel('true positive rate')
61plt.title('Receiver Operator Characteristic')
62plt.legend(loc="lower right")
63
64plt.tight_layout()
65plt.show()

查看下AUC和准确率的结果:

1pipe_lr = pipe_lr.fit(X_train2, y_train)
2y_labels = pipe_lr.predict(X_test[:, [4, 14]])
3y_probas = pipe_lr.predict_proba(X_test[:, [4, 14]])[:, 1]
4# note that we use probabilities for roc_auc
5# the `[:, 1]` selects the positive class label only
1from sklearn.metrics import roc_auc_score, accuracy_score
2print('ROC AUC: %.3f' % roc_auc_score(y_true=y_test, y_score=y_probas))
3print('Accuracy: %.3f' % accuracy_score(y_true=y_test, y_pred=y_labels))
ROC AUC: 0.752
Accuracy: 0.711

代码链接:https://pan.baidu.com/s/1H9GwyuXMVUNEjO8KQyk5Tw

密码: 8cgg

推荐阅读

  • 算法实现太难了?机器学习也需要开源软件

  • TikTok算法背后是抖音用户数据?想多了

  • 维度爆炸?Python实现数据压缩如此简单

  • 马小峰:金融科技界的区块链博士

  • Java 二十五载,正在 Kotlin 化

相关文章:

[百万级]通用存储过程.分页存储过程

/* 名称:spAll_ReturnRows 输入: 输出: 调用: EXEC spAll_ReturnRows SELECT * FROM 表名, 页号, 返回记录数, 主键, 排序字段 spAll_ReturnRows SELECT * FROM all_Categories,2,10,[ID],[ID] 说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录 …

Unsupported major.minor version (jdk版本错误)解决方案

2019独角兽企业重金招聘Python工程师标准>>> 如果你遇到了 Unsupported major.minor version ,请认真看一下,说不定会有帮助。 我花两个小时总结的经验,你可能10分钟就得到了。 ^**^ 一、错误现象: 当改变了jdk版本时…

The key of C# 学习笔记I-II

作者 :Kemins booootLog http://blog.csdn.net/keminlau/ Sunday, October 3, 2004 微软提出的CLS(Common Language Specification, 通用语言标准)对能被用来编写dotNET程序的语言的最小功能集做出了规定。 就拿C#来说,它是目前程序设计语言“以效率换安…

分布式平台下的HS(High-Security) --Apache Shiro API(介绍)

在尝试保护你的应用时,你是否有过挫败感?是否觉得现有的Java安全解决方案难以使用,只会让你更糊涂?本文介绍的Apache Shiro,是一个不同寻常的Java安全框架,为保护应用提供了简单而强大的方法。本文还解释了Apache Shiro的项目目…

豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」

来源 | HyperAI超神经这几天,传出 NVIDIA 将以 400 亿 英镑的价格收购 ARM 的消息,不少媒体在争相报道收购进度的同时,也将整起交易的幕后推手 —— 孙正义,放到了聚光灯下。软银 CEO,传奇投资人,冒险家&am…

Java 集合 — HashMap

HashMap 无序(每次resize的时候都会变)非线程安全key和value都看可以为null使用数组和链表实现查找元素的时候速度快几个重要属性: loadFactor:用来计算thresholdthreshold:决定map是否需要扩容,threshold …

赠书 | 人工智能识万物:卷积神经网络的前世今生

来源 |《Python人工智能开发从入门到精通》作者 | 杨柳、郭坦、鲁银芝责编 | 晋兆雨深度学习在技术与应用上的突破引发了第三次人工智能浪潮,获得了空前成功。在前述章节的基础上,本章将主要介绍训练卷积神经网络和深度神经网络的重要方法与技巧&#xf…

通过WMI获得硬盘和CPU的物理序列号(VB.net)

作者:iwebsms获得硬盘序列号Dim cmicWmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")Dim Uint32 As UInt32For Each cmicWmiObj As ManagementObject In cmicWmi.GetUint32 cmicWmiObj("signature")…

[转] Zend studio中开发常用

转载自: http://www.cnblogs.com/iphper/archive/2012/03/21/2409397.html 、快捷键设置 在zendstudio中开发的过程中,我们应专注与代码的逻辑中,而不是把一大半的时间都浪费在编辑器的操作以及鼠标的点击中,经常使用快捷键进行操作会达到事半…

程序员新手 0年份等级 指导(一) 开发人员IT架构总览

程序员新手 0年份等级 指导(一) 开发人员IT架构总览 程序员新手 0年份等级 指导(一) 开发人员相关IT架构总览之职能分解 开发人员IT架构总览一、职能分解 软件项目的主要组成大体上按照一个项目的生命周期流程分为: 需…

磁盘配额的wmi版本(C#)

作者&#xff1a;iwebsmsusing System;using System.Management;namespace DiskQuota{/// <summary>/// Class1 的摘要说明。/// </summary>class Class1{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(string[] a…

Smarty的配置与高级缓存技术

前言 Smarty 是一个出色的PHP模板引擎&#xff0c;它分离了逻辑代码和user interface。 学习和使用Smarty&#xff0c;没有应用到它的缓存技术是一个很大的损失&#xff0c;它可以将用户最终看到的HMTL文件缓存成一个静态的HTML页&#xff0c;当设定Smarty的cache属性为true时&…

Get了!用Python制作数据预测集成工具 | 附代码

作者 | 李秋键责编 | 晋兆雨大数据预测是大数据最核心的应用&#xff0c;是它将传统意义的预测拓展到“现测”。大数据预测的优势体现在&#xff0c;它把一个非常困难的预测问题&#xff0c;转化为一个相对简单的描述问题&#xff0c;而这是传统小数据集根本无法企及的。从预测…

方差,标准差,协方差、期望值

方差&#xff1a;方差是变量与其平均值的平方和的算术平均值&#xff0c;例如&#xff1a; 有一组数据{4,5,6,7}, 平均值为&#xff1a;(4567)/422/45.5 其方差为&#xff1a;[(4-5.5)2(5-5.5)2(6-5.5)2(7-5.5)2]/4 标准差&#xff1a;方差的开2次方 例如上面那组数据的标准差为…

简单代码的性能差异

《.net 框架程序设计》里的几句代码&#xff0c;我重新整理了一下&#xff0c;写成函数&#xff0c;这样下面的反编译代码看起来更方便点&#xff1a;dahuzizyd的专栏 http://blog.csdn.net/dahuzizyd/publicvoidBoxing() { Int32 v 5; Conso…

求助贴:人工智能offer,阿里or腾讯,选哪个?

笔者曾在脉脉上看到一条网友求助帖&#xff1a;拿到两个offer&#xff0c;一个腾讯&#xff0c;一个阿里&#xff0c;选哪个&#xff1f;抛开“柠檬”这件事不说&#xff0c;笔者观察到另一件事&#xff1a;那就是他的offer都是视觉岗。前一阵刚巧也看到一份报告&#xff1a;人…

EIGRP注入默认路由

实验TOP&#xff1a; 三、实验要求: R1,R2,R3运行EIGRP,用ip default-network 命令使EIGRP向EIGRP域内传递缺省路由,各路由器的各环回口之间路由可达。 四:实验过程: 1、 基本接口的配置.(见图) 1(config)#int e0/0 R1(config-if)#ip add 12.0.0.1 255.255.255.0 R1(config-if)…

Python OpenCV学习笔记之:图像读取,显示及保存

为什么80%的码农都做不了架构师&#xff1f;>>> #-*- coding: utf-8 -*- # 读取&#xff0c;保存&#xff0c;显示图片 import cv2 as cv# 读取为灰度图片 img cv.imread("../../datas/images/fish.jpg",0)# 保存图片 cv.imwrite("../../datas/ima…

简单的特征值梯度剪枝,CPU和ARM上带来4-5倍的训练加速 | ECCV 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记在训练过程中&#xff0c;特征值梯度的回传和权值梯度的计算占了大部分的计算消耗。由于这两个操作都是以特征值梯度作为输入&#xff0c;而且零梯度不会占用计算资源&#xff0c;所以稀疏化特征值梯度可以降低回传阶段的计算消耗以…

获得汉字字符串拼音首字母

作者&#xff1a;iwebsms的专栏 返回给定字符串的首字母Function IndexCode(ByVal IndexTxt As String) As StringDim i As IntegerFor i 1 To IndexTxt.LengthIndexCode IndexCode & GetOneIndex(Mid(IndexTxt, i, 1))NextEnd Function得到单个字符的首字母Private Func…

使用HTTP模块扩展 ASP.NET 处理

HTTP 模块是一个通过实现实现 IHttpModule 接口和处理事件&#xff0c;在每次针对应用程序发出请求时调用的程序集。HTTP 模块作为 ASP.NET 请求管线的一部分调用&#xff0c;能够在整个请求过程中访问生命周期事件。因此&#xff0c;HTTP 模块使我们有机会检查传入和传出的请求…

angular指令ng-class巧用

什么是ng-class ng-class最大的妙用就是可以根据你的逻辑表达式。来添加或移除对应的class ng-class是angular.js里面内置的一个指令。 项目中&#xff0c;有时候&#xff0c;我们需要根据需求来切换不同的class function bb($scope){$scope.ss"className"; } <…

小冰拉开人生第二幕:AI时代的“Office”问世,你的虚拟男友“复活”了

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2014年&#xff0c;小冰正式推出第一代产品&#xff0c;以对话式聊天机器人形式迅速积累训练数据。2020年8月20日&#xff0c;已从微软独立分拆的小冰团队宣布&#xff0c;第八代小冰“出炉”了。小冰团队表…

如何复制一个目录里面的所有目录和文件

作者&#xff1a; cuike519的专栏 http://blog.csdn.net/cuike519/本文介绍如何将一个目录里面的所有文件复制到目标目录里面。 下面介绍几个我们在该例程中将要使用的类&#xff1a; 1、Directory&#xff1a;Exposes static methods for creating, moving, and enumeratin…

ArcGIS问题:如何定义坐标系

一般情况下&#xff0c;我们在利用ArcCatalog建立shp文件的时候就会把相应的坐标系定义好。 具体做法就是鼠标右键单击选择属性&#xff0c;即可编辑其坐标系了&#xff08;方法在&#xff1a;http://gisman.blog.163.com/blog/static/3449338820096134452166/ 投影坐标的定…

Unity3D 材料

为什么80%的码农都做不了架构师&#xff1f;>>> http://docs.unity3d.com/Manual/index.html http://www.maiziedu.com/course/u3d/ http://pan.baidu.com/share/home?uk2217874598#category/type0 http://www.devsiki.com/2015/10/08/indiegamedeveloper.html ht…

12 种方式轻松实现 Ruby 调用

作者 | Gregory Witek译者 | 弯月&#xff0c;责编 | 王晓曼头图 | CSDN 下载自东方IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;最近&#xff0c;与同事聊天的时候&#xff0c;我们谈到了有关 Python 编程的某些方面。我们开玩笑说 Py…

如何实现可以带详细表格的DropDownList

作者&#xff1a; cuike519的专栏 http://blog.csdn.net/cuike519/本文详细介绍了如何实现在点击DropDownList的时候弹出DataGrid&#xff0c;然后从DataGrid里面选择相应的项。很早就发现在网上有很酷的下拉选择框&#xff0c;今天我在这里也写一个&#xff0c;该方法旨在说…

在数据库组件中用业务规则剖析挑选数据

2019独角兽企业重金招聘Python工程师标准>>> 直接去 techsmith 吧 http://www.screencast.com/t/6o6iWQac 转载于:https://my.oschina.net/ychenIntegration/blog/61634

如果根据日志去禁用user_agent

查看user_agent打开日志文件 cat /usr/local/apache2/logs/test.com-access_20161111_log如何不显示chrome和curl的日志1.打开虚拟主机配置文件vi /usr/local/apache2/conf/extra/httpd-vhosts.conf添加一代代码<IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{H…