简单线性回归的实现
zip()
1 |
|
划分数据样本
1 | def train_test_split(X, y, test_ratio=0.2, seed=None): |
scikit-learn中的MSE和MAE
1 | from sklearn.metrics import mean_squared_error |
metrics 衡量指标
scikit-learn当中的 SGD
1 |
|
kNN计算技巧
Counter
1 | topK_y = [y_train[neighbor] for neighbor in nearest[:k]] |
相关难点
1 |
|
模仿scikit-learn对于 kNN的封装
1 | class KNNClassifier: |
训练数据和 测试数据
1 | #train_test_split |
kNN准确度-模型选择 与 超参数
- 超参数:在算法运行前需要决定的参数
- 模型参数:算法过程中学习的参数
注意:kNN没有模型参数,但是k是典型的超参数.
寻找好的超参数
领域知识: 在领域库添加(此处不用)
经验数值: k=5则是经验知识
实验搜索: 不断实验,搜索最好的
找到10之后, 还是可以在8-20之中继续查找。
k近邻算法
增加 距离权重参数!(不仅仅通过 最近距离的投票方法。)
距离
- 欧拉距离
- 曼哈顿距离
- 明可夫斯基距离
最终KNeighborsClassifier 的超参数有:
k, p, weights —— 两个两个的进行网格搜索,实验寻找最好的超参数。
网格搜索 和 更多kNN中的超参数
Grid Search
sklearn中使用方法
- from sklearn import datasets
- from sklearn.model_slection import train_test_split
- from sklearn.neighbors import KNeighborsClassifier
- sk_knn_clf = KNeighborsClassfier( n_neighbors = 3, weights=”uniform/distance”, p=1 )
GridSearchCV—— 交叉验证
- from sklearn.model_selection import GridSearchCV
- grid_search = GridSearchCV( knn_clf, param_grid, n_jobs=-1, verbose = 2 )
n_jobs自动进行核分配
verbose = 2 整数值越大,输出的数值 越详细。
- grid_search.fit(X_train, y_train)
- grid_saerch.best_estimator_ #返回一个最佳的knn_clf() 对象!
- grid_search.best_score_
- grid_saerch.best_params_
更多的超参数
- KNeighborsClassifier 还有一个 metrics参数
对应:
identifier | class name | args | distance function | ||
---|---|---|---|---|---|
“euclidean” | EuclideanDistance | sqrt(sum((x - y)^2)) | |||
“manhattan” | ManhattanDistance | sum(\ | x - y\ | ) | |
“chebyshev” | ChebyshevDistance | max(\ | x - y\ | ) | |
“minkowski” | MinkowskiDistance | p | sum(\ | x - y\ | ^p)^(1/p) |
“wminkowski” | WMinkowskiDistance | p, w | sum(\ | w * (x - y)\ | ^p)^(1/p) |
“seuclidean” | SEuclideanDistance | V | sqrt(sum((x - y)^2 / V)) | ||
“mahalanobis” | MahalanobisDistance | V or VI | sqrt((x - y)’ V^-1 (x - y)) |
数据归一化
如果不进行相应变量的参数归一化,很容易被 对应变量的大小进行主导
x: 1 5
y: 200 100 这样就被y主导,不能反应每一个变量的特征
sklearn使用 数据归一化
from sklearn.preprocessing import StandardScaler
1
2
3
4
5
6
7
8
9
10
11
12 standardScalar = StandardScaler()
standardScalar.fit( X_train ) # 获得自己的均值和方差
standardScalar.mean_
#standardScalar.std_
standardScalar.scale_#更换为 描述数据统计分布范围
#X_train/X_test 进行数据归一化处理
standardScalar.transform( X_train )
X_train = standardScalar.transform( X_train ) #这个样才行
X_test_standard = standardScalar.transform( X_test )
内部Scalar的 自我实现
1 | def fit( self,X ): |
同样也可以进行 MinMaxScalar的import
import sklearn.preprocessing import StandardScaler
scikit-learn中的 PCA
from sklearn.decomposition import PCA
1 | pca = PCA(n_components=1) |
PCA当中 我们应该,设置降维到多少 维度呢?
- pca.explained_variance_ratio_
pca当中 每一个维度,占方差 贡献的重要程度—— 根据重要程度 进行分类!
通过绘制 折线图,查看前多少维度 贡献多少。
1
2
3 plt.plot([i for i in range(X_train.shape[1])],
[np.sum(pca.explained_variance_ratio_[:i+1]) for i in range(X_train.shape[1])])
plt.show()scikit-learn 已经给我们封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14 pca = PCA(0.95) # n_components 不用传,直接传输贡献率
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)
%%time
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_reduction, y_train)
knn_clf.score(X_test_reduction, y_test)
# 降低到28维 看可; 权衡 是否想要 为了加快时间,而牺牲精度的方法
# 降低到2维, 方便进行图形的查看降低到28维 看可; 权衡 是否想要 为了加快时间,而牺牲精度的方法
降低到2维, 方便进行图形的查看
MNIST数据集 进行更大量、更正规的 机器学习的方法应用
使用PCA进行降维 训练时间和预测时间都减少了
而且有可能因为 降维去除了噪音,有可能准确率更高了!
PCA降噪
平常有可能数据有噪音抖动,还有可能 测量过程中有了噪音。
作用:降低纬度 丢失信息 去除了噪音
sklearn中的数据 预处理方法
数据处理中一般处理方法:
- 数据加载和预处理为标准的数组数据/方便进行获取和数组建立操作
- 进行训练样本和测试样本的划分
- 进行训练和测试 样本的数据归一化操作
- 根据不同的 分类/回归任务,选用不同的方法 进行数据的再处理和加工
- 多项式回归进行升维度
- knn可以直接进行 k近邻分类
数据集划分
1 | from sklearn.model_selection import train_test_split |
数据尺度 归一化
1 | from sklearn.preprocessing import StandardScaler |
多项式回归(8-2
1 | from sklearn.preprocessing import PolynomialFeatures |
进行数据的升维,多项式回归的预处理方法
多项式特征 数据归一化 线性回归
使用 Pipeline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, 100)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
poly_reg = Pipeline([
("poly", PolynomialFeatures(degree=2)),
("std_scaler", StandardScaler()),
("lin_reg", LinearRegression())
])
poly_reg.fit(X, y)
y_predict = poly_reg.predict(X)
plt.scatter(x, y)
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
plt.show()new一个管道,传入相应的数据集; 数据集就能沿着管道依次进行 执行。得到最后的结果!
虽然 sklearn没有给我们封装 多项式回归方法,但是我们可以用Pipeline进行 多种方法封装,并进行操作。
评价标准
均方误差:
1
2
3
4 from sklearn.metrics import mean_squared_error
y_predict = lin_reg.predict(X)
mean_squared_error(y, y_predict)
岭回归
1 | # 使用岭回归 不再是线性回归了. |
由于上面的 alpha占比重小,所以 不太会考虑theta对于损失函数的影响,造成了 theta过大的问题。
1 | # More: |
LASSO回归
1 | from sklearn.linear_model import Lasso |
train_test_split 改进——使用交叉验证进行 模型构建
使用三叠交叉验证( Cross Validation )
1 | from sklearn.model_selection import cross_val_score |
使用网格搜索——进行相应的 超参数的寻找
1 | from sklearn.model_selection import GridSearchCV |
逻辑回归算法(Logistic Regression)
逻辑回归实际是分类问题
讲样本的特征和样本发生的概率联系起来,概率是一个数。又称为回归问题。
性能度量 泛化能力度量
1 | # ./metrics |
逻辑回归,添加多项式 和 模型正则化
1 | def PolynomialLogisticRegression(degree, C, penalty='l2'): |
逻辑回归当中进行 多分类操作
1 | # OvR 多分类手段方法 |
sklearn 封装了OVR和OVO
1 | from sklearn.multiclass import OneVsRestClassifier |
以上可以传入所有的 二分类器进行,多分类 任务!~
分类中的评价方法
混淆矩阵
混淆矩阵相关的实现
1 | def TP(y_true, y_predict): |
混淆矩阵 scikit-learn中的实现
1
2
3
4
5
6
7
8
9
10
11 # 混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_log_predict)
# 精准率
from sklearn.metrics import precision_score
precision_score(y_test, y_log_predict)
# 召回率
from sklearn.metrics import recall_score
recall_score(y_test, y_log_predict)
混淆矩阵中的比较——学习器性能的好坏
分类评价方法在F1-score中的实现应用方法
1 | from sklearn.metrics import confusion_matrix |
更改阈值
1
2
3
4
5 decision_scores = log_reg.decision_function(X_test)
y_predict_2 = np.array(decision_scores >= 5, dtype='int')
confusion_matrix(y_test, y_predict_2)
precision_score(y_test, y_predict_2)
recall_score(y_test, y_predict_2)
Precision-Recall 曲线
绘制
1
2
3
4
5 from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_test, decision_scores)
# 注意,p r最终数值为0&1 ,对应thresholds没有数值;即 thresholds少一个数值。
ROC曲线绘制
1 | from sklearn.metrics import roc_curve |
注意对于 有偏的数据还是应该使用p-r对应查看;roc_auc_score对应用来查看 比较算法/超参数使用对于分类算法好坏孰优孰劣!
多分类问题 在scikit-learn中的应用
1 | from sklearn.metrics import precision_score |
MORE:TensorFlow初接触
TensorFlow数据流图和概念解析
怎样与开发者建立联系。
未来重复类型的工作都会交给人工智能进行操作。人类主要从事偏创造类和情感类的 工作。
支撑向量机
硬间隔SVM
与kNN类似都现需要进行 数据归一化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(X)
X_standard = standardScaler.transform(X)
from sklearn.svm import LinearSVC
svc = LinearSVC(C=1e9)
svc.fit(X_standard, y)
# support vector classifier
from sklearn.svm import LinearSVC
svc = LinearSVC(C=1e9)
svc.fit(X_standard, y)注意:上方引入的只是线性SVM进行分类的svm算法
注意 :svc.coef_
和svc.intercept_
对应w0 * x0 + w1 * x1 + b = 0
软间隔SVM并 绘制超平面
1 | w = model.coef_[0] |
处理高度非线性特征分类-使用svm方法
使用多项式特征的SVM
1 | from sklearn.preprocessing import PolynomialFeatures, StandardScaler |
使用多项式核函数的SVM
注意: SVM算法本身也是 带有多项式化方法的——核函数
1
2
3
4
5
6
7
8
9
10
11
12 from sklearn.svm import SVC
def PolynomialKernelSVC(degree, C=1.0):
return Pipeline([
("std_scaler", StandardScaler()),
("kernelSVC", SVC(kernel="poly", degree=degree, C=C))
])
poly_kernel_svc = PolynomialKernelSVC(degree=3)
poly_kernel_svc.fit(X, y)
# 然后进行图像化展示,并不是为了进行预测!
高斯核函数讲解
1 | l1, l2 = -1, 1 |
使用高斯核函数(RBF)的sklearn方法
>
1 | from sklearn.preprocessing import StandardScaler |
SVM思想解决回归问题
1 | from sklearn.svm import LinearSVR |
注意:SVR之于 前面的SVC相应的用法相似,但是参数不同.
决策树 在sklearn中的使用
决策树使用
1 | from sklearn.tree import DecisionTreeClassifier |
决策树其他参数
1 | # 决策树中 至少需要多少个样本数据才能继续 拆分下去 |
- min_samples_split
- min_samples_leaf
- min_weight_fraction_leaf
- max_depth
- max_leaf_nodes
- min_features
- 更多scikit-learn决策树的参数和详细解释,相请参照这里.
决策树解决回归问题
叶子节点包含相应的数据,如果包含的是类别的话。
参数都一样,区别在于 叶子结点是分类结果、还是回归结果?
1
2
3
4
5
6
7
8
9
10
11
12
13 from sklearn.tree import DecisionTreeRegressor
dt_reg = DecisionTreeRegressor()
dt_reg.fit(X_train, y_train)
dt_reg.score(X_test, y_test)
## 0.58605479243964098
# 显然过拟合了!加入了自己本身的特征!
# 回归算法决策树很容易过拟合
dt_reg.score(X_train, y_train)
## 1.0
集成学习
进行多方面算法集成
kNN
逻辑回归
SVM
决策树
神经网络
贝叶斯
最后进行投票,少数服从多数
VotingClassifier
集成学习-投票集成使用:
1 | from sklearn.ensemble import VotingClassifier |
soft-classifier
更合理的投票,应该有权值—— 专家的话语应该权重更大!
1
2
3
4
5
6
7
8
9
10 voting_clf2 = VotingClassifier(estimators=[
('log_clf', LogisticRegression()),
('svm_clf', SVC(probability=True)),
('dt_clf', DecisionTreeClassifier(random_state=666))],
voting='soft')
# 使用soft voting classifier必须要求集合中每个模型都能估计概率!
voting_clf2.fit(X_train, y_train)
voting_clf2.score(X_test, y_test)
入门完成
如何集成更多分类器,给我们更好地表现呢?
虽然有很多机器学习方法,但是从投票角度看,仍然不够多
我们需要创建更多的子模型!集成更多的子模型
子模型之间不能一致!子模型之间要有差异性!创建差异性——没格子模型只看样本数据的一部分。
可以每个子模型只看100个样本数据!
每个子模型不需要太高的准确率(但是也不能太低!)
1 | from sklearn.tree import DecisionTreeClassifier |
OOB(OUT-of-bag)
使用那些为渠道的样本做测试和验证
1 |
|
由此看出 Bagging思路非常容易进行并行化处理的方法
- 增加参数——
n_jobs
使用多个核进行处理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
random_subspaces_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500, max_samples=500,
bootstrap=True, oob_score=True,
max_features=1, bootstrap_features=True)
random_subspaces_clf.fit(X, y)
random_subspaces_clf.oob_score_
# 随机特征取样
random_patches_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500, max_samples=100,
bootstrap=True, oob_score=True,
max_features=1, bootstrap_features=True)
random_patches_clf.fit(X, y)
random_patches_clf.oob_score_
#随机特征+随机样本取样
随机森林
由多个树组成的森林叫做随机森林
简单使用
1
2
3
4
5
6
7
8
9
10
11
12
13 from sklearn.ensemble import RandomForestClassifier
# 也是使用Bagging进行随机取样的,所以可以有 决策树类似分类器
rf_clf = RandomForestClassifier(n_estimators=500, oob_score=True, random_state=666, n_jobs=-1)
rf_clf.fit(X, y)
rf_clf.oob_score_
## 0.89200000000000002
rf_clf2 = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, oob_score=True, random_state=666, n_jobs=-1)
rf_clf2.fit(X, y)
rf_clf2.oob_score_
## 0.90600000000000003注意在sklearn中的使用,RF相当于是 结合了BaggingClassifier和 DecisionTreeClassifier 参数使用!都有用到!
MORE 使用ExtraTree进行 分类
1
2
3
4
5
6 from sklearn.ensemble import ExtraTreesClassifier
et_clf = ExtraTreesClassifier(n_estimators=500, bootstrap=True, oob_score=True, random_state=666, n_jobs=-1)
et_clf.fit(X, y)
et_clf.oob_score_
分类相应的对应有 回归方法——Regressor
1 | from sklearn.ensemble import BaggingRegressor |
Boosting
Ada Boosting
每次一步步赋予权重进行修正
1
2
3
4
5
6
7
8
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
# 关键是学习算法(基学习器) 和 一步步赋予权重
ada_clf = AdaBoostClassifier(
DecisionTreeClassifier(max_depth=2), n_estimators=500)
ada_clf.fit(X_train, y_train)
Gradient Boosting
>1
2
3
4
5
6from sklearn.ensemble import GradientBoostingClassifier
gb_clf = GradientBoostingClassifier(max_depth=2, n_estimators=30)
gb_clf.fit(X_train, y_train)
gb_clf.score(X_test, y_test)
Boosting解决回归问题
1
2 from sklearn.ensemble import AdaBoostRegressor
from sklearn.ensemble import GradientBoostingRegressor