Python--scikit-learn
数据集 sklearn.datasets
- from sklearn.datasets import load_iris, fetch_20newsgroups
- 小数据集下载 load_xxx
- 大数据集下载 fetch_xxx
模型
KNN K-近邻算法
- 参考
- 距离计算
- k值选择
- kd树
- 维度:选择(剩余维度)方差大的维度
- 数据划分:选择当前维度的中位数,小于中位数的放左边,大于中位数的放右边
- from sklearn.neighbors import KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
# 构造数据
x = [[1], [2], [10], [20]]
y = [0, 0, 1, 1]
# 训练模型
estimator = KNeighborsClassifier(n_neighbors=1)
estimator.fit(x, y)
# 数据预测
ret = estimator.predict([[0], [14]])
print('result: ', ret)
- 案例1
import pprint
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 获取数据 load_xxx
iris = load_iris()
# pprint.pprint(iris)
# 划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=1)
# 特征工程:对数据进行标准化处理
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# 创建模型算法实例, knn
knn = KNeighborsClassifier(n_neighbors=5)
# 使用模型训练
knn.fit(x_train, y_train)
# 对测试集进行预测
y_predict = knn.predict(x_test)
print('预测结果:')
print(y_predict == y_test)
# 计算预测准确率
score = accuracy_score(y_test, y_predict)
# score = knn.score(x_test, y_test)
print('准确率:', score)
- 案例2 使用交叉验证
import pprint
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 获取数据 load_xxx
iris = load_iris()
# pprint.pprint(iris)
# 划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=1)
# 特征工程:对数据进行标准化处理
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# 创建模型算法实例, knn
knn = KNeighborsClassifier()
# 指定超参数
param_grid = {'n_neighbors': [5, 1, 3]}
# 使用交叉验证
gs_cv = GridSearchCV(knn, param_grid=param_grid, cv=5)
# 使用模型训练
gs_cv.fit(x_train, y_train)
# 对测试集进行预测
y_predict = gs_cv.predict(x_test)
print('预测结果:')
print(y_predict == y_test)
# 计算预测准确率
score = gs_cv.score(x_test, y_test)
print('准确率:', score)
print('交叉验证最好的准确率:', gs_cv.best_score_)
print('交叉验证最好准确率的模型:', gs_cv.best_estimator_)
print('交叉验证过程中所有结果:')
pprint.pprint(gs_cv.cv_results_)
线性回归
-
from sklearn.linear_model import LinearRegression, SGDRegressor
- LinearRegression 使用的是正规方程
- coef_ 求得的线性回归系数
- intercept_ 偏置
- SGDRegressor 使用的是随机梯度下降
- LinearRegression 使用的是正规方程
-
岭回归
- sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
- 具有l2正则化的线性回归
- alpha:正则化力度,也叫 λ
- 正则化力度越大,权重系数会越小
- 正则化力度越小,权重系数会越大
- solver: 会根据数据自动选择优化方法
- sag: 如果数据集、特征都比较大,选择该随机梯度下降优化(SAG)
- normalize: 数据是否进行标准化
- normalize=False: 可以在fit之前调用preprocessing.StandardScaler标准化数据
- Ridge.coef_: 回归权重
- Ridge.intercept_: 回归偏置
- 相当于SGDRegressor(penalty='l2', loss="squared_loss"),不过SGDRegressor使用的优化方法是SGD,而Ridge可以使用SAG
- sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)
- 具有l2正则化的线性回归,可以进行交叉验证
- coef_: 回归系数
-
损失函数
-
优化方法
- 正规方程:使用公式直接计算系数W,适用于小规模数据
- 梯度下降:不断迭代计算,不一定能得到准确系数,适用于大规模数据
- 损失函数
- 学习率
- 全梯度下降算法(Full gradient descent),
- 随机梯度下降算法(Stochastic gradient descent),
- 小批量梯度下降算法(Mini-batch gradient descent),
- 随机平均梯度下降算法(Stochastic average gradient descent)
-
拟合
- 欠拟合
- 在训练集上表现不好,在测试集上表现不好
- 解决方法:
- 添加其他特征项
- 添加多项式特征
- 过拟合
- 在训练集上表现好,在测试集上表现不好
- 解决方法:
- 重新清洗数据集
- 增大数据的训练量
- 正则化
- 减少特征维度
- 正则化
- 通过限制高次项的系数进行防止过拟合
- L1正则化
- 理解:直接把高次项前面的系数变为0
- Lasso回归
- L2正则化
- 理解:把高次项前面的系数变成特别小的值
- 岭回归
- 正则化线性模型
- Ridge Regression 岭回归
- Lasso 回归
- Elastic Net 弹性网络
- Early stopping
- 欠拟合
-
简单案例
from sklearn.datasets import load_iris
from sklearn.metrics import mean_squared_error, accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
import joblib
def liner_demo():
iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# x_test = scaler.fit_transform(x_test)
# estimator = LinearRegression()
estimator = SGDRegressor()
estimator.fit(x_train, y_train)
log(estimator, x_test, y_test)
# 保存模型
joblib.dump(estimator, 'iris_linear_demo.pkl')
# 加载模型
estimator_loaded = joblib.load('iris_linear_demo.pkl')
log(estimator_loaded, x_test, y_test)
def log(estimator, x_test, y_test):
print('回归系数:', estimator.coef_)
print('偏置:', estimator.intercept_)
# 预测
y_predict = estimator.predict(x_test)
print('预测结果:', y_predict)
# 计算误差
error = mean_squared_error(y_test, y_predict)
print('误差:', error)
liner_demo()
逻辑回归
- 实际是一个二分类模型
- 逻辑回归的输入是线性回归的输出
- 激活函数 sigmoid函数
- 把整体的值映射到[0,1]
- 再设置一个阈值,进行分类判断
- 损失函数
- 对数似然损失函数
- 真实值分为0、1两种
- 优化:提升原本属于1类别的概率,降低原本是0类别的概率
- sklearn.linear_model.LogisticRegression(solver='liblinear', penalty='l2', C = 1.0)
- solver可选参数:{'liblinear', 'sag', 'saga','newton-cg', 'lbfgs'},
- 默认: 'liblinear';用于优化问题的算法。
- 对于小数据集来说,“liblinear”是个不错的选择,而“sag”和'saga'对于大型数据集会更快。
- 对于多类问题,只有'newton-cg', 'sag', 'saga'和'lbfgs'可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。
- penalty:正则化的种类
- C:正则化力度
- LogisticRegression方法相当于 SGDClassifier(loss="log", penalty=" "),SGDClassifier实现了一个普通的随机梯度下降学习。而使用LogisticRegression(实现了SAG)
- solver可选参数:{'liblinear', 'sag', 'saga','newton-cg', 'lbfgs'},
- 分类评估
- 准确率:(TP + TN) / (TP + FN + FP + TN)
- 精确率:TP / (TP + FN)
- 召回率:TP / (TP + FP)
训练
- 数据集划分:
- from sklearn.model_selection import train_test_split, LeaveOneOut, KFold, StratifiedKFold
- LeaveOneOut 留一法
- 分层采样的KFold,分层采样,即训练集,测试集中每种类别的数据的占比与整体数据中的占比保持一致
- 特征工程
- 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据的过程
- 归一化:通过对原始数据进行变换,把数据映射到一个区间内,默认是[0, 1]
- from sklearn.preprocessing import MinMaxScaler
- 转换方法:fit_transform()
- 标准化:通过对原始数据进行变换,把数据变换到均值为0,标准差为1的数据
- from sklearn.preprocessing import StandardScaler
- 转换方法:fit_transform()
- x` = x - mean / σ
- from sklearn.preprocessing import StandardScaler
- 交叉验证
- 训练集再次划分为:训练集+验证集
- 网格搜索
- 超参数,比如knn的k
- from sklearn.model_selection import GridSearchCV
- 模型保存和加载
- 旧版本的scikit-learn是:sklearn.externals import joblib
- 保存:joblib.dump(estimator, '模型文件名称.pkl')
- 加载:estimator = joblib.load('模型文件名称.pkl')
- 新版本的scikit-learn没有joblib模块了,需要安装独立的joblib包
- pip install joblib
- 旧版本的scikit-learn是:sklearn.externals import joblib