-
机器学习算法分类
监督学习:输入数据有特征也有标签值
分类:k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
回归:线性回归、岭回归
标注:隐马尔可夫模型无监督学习:输入数据有特征但无标签值
聚类:k-means -
机器学习开发流程
(1)收集原始数据,明确需解决问题
(2)数据的基本处理(缺失值、合并等)
(3)特征工程
(4)找到合适的算法建立模型
(5)模型的评估,判断效果
(6)若效果不好,继续重复(3)、(4)、(5)步 -
机器学习数据集
训练集:用于训练,构建模型
测试集:用于检验,评估模型是否有效
训练集:测试集 = 75%:25% (一般)
数据集划分API:sklearn.model_selction.train_test_splitfrom sklearn.datasets import load_iris from sklean.model_selection import tran_test_split li = load_iris() x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25)
-
转换器与估计器
-1- 转换器
from sklean.preprocessing import StandardScaler # 直接调用fit_transform s = StandardScaler() s.fit_transform([[1,2,3],[4,5,6]]) # 先调用fit再调用transform ss = StandardScaler() ss.fit([[1,2,3],[4,5,6]]) # 根据导入数据计算相关参数 ss.transform([[1,2,3],[4,5,6]]) # 代入参数完成转换
-2- 估计器
用于分类的估计器:
sklearn.neighbors k-近邻算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归用于回归的估计器:
sklearn.Linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge. 岭回归
-3- 集成学习
建立多个模型组合解决单一预测问题,原理是生成多个分类器或模型,分别独立的对结果进行预测,最后将各单预测结果组合为最终结果。
分类算法
-
k-近邻算法(KNN) (sklearn.neighbors.KNeighborClassifier)
利用新样本在特征空间中的k个最邻近的样本大多数属于的类别作为该新样本的类别。
两个样本之间的距离可以用欧式距离计算,计算前需要进行标准化:
from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler def knncls(): """ K-近邻预测用户签到位置 :return:None """ # 读取数据 data = pd.read_csv("./data/FBlocation/train.csv") # 处理数据 # 1、缩小数据,查询数据晒讯 data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75") # 处理时间的数据 time_value = pd.to_datetime(data['time'], unit='s') # 把日期格式转换成 字典格式 time_value = pd.DatetimeIndex(time_value) # 构造一些特征 data['day'] = time_value.day data['hour'] = time_value.hour data['weekday'] = time_value.weekday # 把时间戳特征删除 data = data.drop(['time'], axis=1) # 把签到数量少于n个目标位置删除 place_count = data.groupby('place_id').count() tf = place_count[place_count.row_id > 3].reset_index() data = data[data['place_id'].isin(tf.place_id)] # 取出数据当中的特征值和目标值 y = data['place_id'] x = data.drop(['place_id'], axis=1) # 进行数据的分割训练集合测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 特征工程(标准化) std = StandardScaler() # 对测试集和训练集的特征值进行标准化 x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # 进行算法流程 # 超参数 knn = KNeighborsClassifier() # # fit, predict,score # knn.fit(x_train, y_train) # # # 得出预测结果 # y_predict = knn.predict(x_test) # # print("预测的目标签到位置为:", y_predict) # # # 得出准确率 # print("预测的准确率:", knn.score(x_test, y_test)) # 构造一些参数的值进行搜索 param = {"n_neighbors": [3, 5, 10]} # 进行网格搜索 gc = GridSearchCV(knn, param_grid=param, cv=2) gc.fit(x_train, y_train) # 预测准确率 print("在测试集上准确率:", gc.score(x_test, y_test)) print("在交叉验证当中最好的结果:", gc.best_score_) print("选择最好的模型是:", gc.best_estimator_) print("每个超参数每次交叉验证的结果:", gc.cv_results_) return None
k值取值影响:
k值取值很小:容易受异常点影响
k值取值很大:容易受样本总体类别分布影响k近邻算法优缺点:
优点: 简单,易于理解和实现,无需参数估计,无需训练
缺点: 属于懒惰算法,计算量大,内存开销大。必须人为选择k值,分类精度很大程度取决于k值的选择。
使用场景: 小数据场景 -
朴素贝叶斯 (sklearn.naive_bayes.MultinomialNB)
前提: 特征相互独立
基本原理: 利用贝叶斯公式求得给定特征下,目标分别为每一种类别的概率,取概率最大的类别作为预测结果。
在求P(Fi|C)时,某些特征词容易求得出现概率为0,此时使用拉普拉斯平滑解决。
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report def naivebayes(): """ 朴素贝叶斯进行文本分类 :return: None """ news = fetch_20newsgroups(subset='all') # 进行数据分割 x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25) # 对数据集进行特征抽取 tf = TfidfVectorizer() # 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d'] x_train = tf.fit_transform(x_train) print(tf.get_feature_names()) x_test = tf.transform(x_test) # 进行朴素贝叶斯算法的预测 mlt = MultinomialNB(alpha=1.0) print(x_train.toarray()) mlt.fit(x_train, y_train) y_predict = mlt.predict(x_test) print("预测的文章类别为:", y_predict) # 得出准确率 print("准确率为:", mlt.score(x_test, y_test)) print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names)) return None
朴素贝叶斯优缺点:
优点: 源于古典数学理论,有稳定的分类效率;对缺失数据不敏感,算法简单,无需调参,常用于文本分类;分类精确度高,速度较快。
缺点: 使用了样本特征间相互独立的假设,在假设不满足时,即特征间相互关联时效果不好。 -
决策树
-
信息论
(1)信息熵H:单位为比特bit,反应不确定性和混乱程度。信息和消除不确定性是相关联的
(2) 信息增益
因得知特征A,使得集合D的信息熵的不确定性减少。
(3)决策树特征选择原则
ID3:信息增益最大原则
C4.5:信息增益比最大原则
CART:回归树 - 平方误差最小,分类数 - 基尼系数最小 -
决策树(sklearn.tree.DecisionTreeClassifier)
def decision(): """ 决策树对泰坦尼克号进行预测生死 :return: None """ # 获取数据 titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt") # 处理数据,找出特征值和目标值 x = titan[['pclass', 'age', 'sex']] y = titan['survived'] print(x) # 缺失值处理 x['age'].fillna(x['age'].mean(), inplace=True) # 分割数据集到训练集合测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 进行处理(特征工程)特征-》类别-》one_hot编码 dict = DictVectorizer(sparse=False) x_train = dict.fit_transform(x_train.to_dict(orient="records")) print(dict.get_feature_names()) x_test = dict.transform(x_test.to_dict(orient="records")) # 用决策树进行预测 dec = DecisionTreeClassifier(max_depth = 10) dec.fit(x_train, y_train) # # 预测准确率 print("预测的准确率:", dec.score(x_test, y_test)) # 导出决策树的结构 export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
决策树优缺点:
优点: 易于理解和解释,可以可视化;需要的数据准备很少,不需要归一化等操作。
缺点: 易发生过拟合
改进: 剪枝cart算法、随机森林 -
随机森林 (sklearn.ensemble.RandomForestClassifier
随机森林是有多个决策树组成的集成学习方法,其返回结果为所有决策树结果的多数。
随机不放回抽样:保证每个决策树的训练集不同,以平均的方式减小预测的方差,消除各决策树的有偏性。
超参数:树的棵树,树的深度,最大特征数等。from sklearn.ensemble import RandomForestClassifier # 随机森林进行预测 (超参数调优) rf = RandomForestClassifier() param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]} # 网格搜索与交叉验证 gc = GridSearchCV(rf, param_grid=param, cv=2) gc.fit(x_train, y_train) print("准确率:", gc.score(x_test, y_test)) print("查看选择的参数模型:", gc.best_params_) return None
随机森林优缺点:
优点: 可同时处理分类或数值特征,具有极好的准确率;适用于大数据集(样本数大、特征数大);不需要降维,能够确定不同特征的重要性。
缺点: 计算成本高,学习时间长,如训练数据中存在噪声,容易发生过拟合。
-
分类模型的评估(sklearn.metrics.classification_report)
1. 准确率 (estimator.score())
2. 混淆矩阵 (Confusion Matrix)
3. 精确率 (precision) 和召回率 (recall)
4. 稳健性 (F1-score)
-
模型选择与评优
- 交叉验证 (Cross Validation)
将数据等分为n份,其中一份作为验证集,其余作为训练集。进行n次模型训练,每次选择不同的验证集,得到n组实验结果,以这些结果的均值作为最终结果,又称为n则交叉验证。
- 网格搜索 (Grid Search) / 超参数搜索 (sklearn.model_selection.GridSearchCV)
模型中需要人工选择的参数 称为超参数 (hyperparameter)。超参数的选择可以通过网格搜索来实现,对每组超参数进行交叉验证(一般为十折交叉验证),取结果最好的一组超参数作为最终选择的超参数。