前言:
阅读本篇文章需要阅读:
k-近邻算法实例
数据来源:https://www.kaggle.com/c/facebook-v-predicting-check-ins
# 注册该网站需要访问外国网站,下载数据也比较慢
# 后台回复数据获取数据,访问外国网站插件也给大家,免费试用3天。
题目是这样的:
本次比赛的目的是预测一个人想要登记的地方。为了本次比赛的目的,
Facebook创建了一个人工世界,其中包括10多公里10平方公里的100,000多个地方。
对于给定的坐标集,您的任务是返回最可能位置的排序列表。数据被制作成类似于来自移动
设备的位置信号,让您了解如何处理由不准确和嘈杂的值导致的实际数据。
不一致和错误的位置数据可能会破坏Facebook Check In等服务的体验。
数据说明:
train.csv,test.csv
row_id:签到事件的id
xy:坐标
准确度:定位精度
时间:时间戳
place_id:业务的ID,这是您预测的目标
# 我只用了train.csv,由于数据量太大。你可以两个都用上。
实例:
# 导入模块api
import pandas as pd
# 标准化处理模块
from sklearn.preprocessing import StandardScaler
# 分割数据集
from sklearn.model_selection import train_test_split
# k-近邻算法
from sklearn.neighbors import KNeighborsClassifier
# k-近邻预测用户签到位置
def knncls():
# 读取数据
data = pd.read_csv("D:/shuju/train.csv")
#print(data.head(5))
'''
ID x坐标 y坐标 坐标准确性 时间戳 预测目标
row_id x y accuracy time place_id
0 0 0.7941 9.0809 54 470702 8523065625
1 1 5.9567 4.7968 13 186555 1757726713
2 2 8.3078 7.0407 74 322648 1137537235
3 3 7.3665 2.5165 65 704587 6567393236
4 4 4.0961 1.1307 31 472130 7440663949
'''
# 由于数据过大,很慢,这里我选择缩小数据(你可以不进行缩小,效果更好)
# 只取x在1.0-1.25之间的和y在2.5-2.75之间的,你可以随意修改,也可以读取全部
data = data.query('x > 1.0& x < 1.25 & y > 2.5 &y<2.75')
# 处理时间戳,unit = 's'表示按照秒转换。
time_value = pd.to_datetime(data['time'],unit = 's')
#print(time_value) # 17467条数据
'''
863 1970-01-03 20:13:11
1693 1970-01-04 06:16:23
9877 1970-01-06 19:49:58
...
Name: time, Length: 17467, dtype: datetime64[ns]
'''
# 把日期转换成字典 转换成字典可以获取年月日等
time_value = pd.DatetimeIndex(time_value)
# 构造时间特征加入到data中,选择自己需要的特征(年月都是一样的,只获取日,小时,工作日)
# 如果直接写成data['day'] = time_value.day 会有警告信息
data = data.copy()
data.loc[:,'day'] = time_value.day
data.loc[:,'hour'] = time_value.hour
data.loc[:,'weekday'] = time_value.weekday
# 删除时间戳,按照列删除,在pd中是1,在sklearn中是1
data = data.drop(['time'],axis=1)
# print(data)
'''
row_id x y accuracy place_id day hour weekday
863 863 1.3828 2.6444 64 5784939944 3 20 5
1693 1693 1.2583 2.6839 72 3952821602 4 6 6
'''
# 删除目标值重复少于4个的数据,目标值太多
# 分组求个数
place_count = data.groupby('place_id').count()
# 分组后place_count.row_id为次数
# 按照place_id分组会将目标值当成索引,reset_index将索引变为0,1..加入到特征列
tf = place_count[place_count>4].reset_index()
# 过滤掉少于4个签到的目标值
data = data[data['place_id'].isin(tf.place_id)]
# 取出特征值和目标值(删除目标值)
y = data['place_id']
x = data.drop(['place_id'],axis = 1)
# 删除row_id特征
data = data.drop(['row_id'],axis=1)
# 数据分割成训练集和测试集
# x_train:训练集特征值
# x_test:测试集特征值
# y_train:训练集目标值
# y_test:测试集目标值
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25)
# 如果不做标准化处理使用k-近邻算法
# knn = KNeighborsClassifier(n_neighbors=5)
# 传入训练集的特征值和目标值
# knn.fit(x_train,y_train)
# 得出预算结果,通过测试集的特征值来预测
# y_predict = knn.predict(x_test)
# 查看准确率,输入测试集的特征值和目标值
# print('预测准确率为:',knn.score(x_test,y_test))
'''
预测准确率为: 0.011907487978016945
也就是1.1% 100个数据有1个对的
原因:1、数据没有全用上,我这里只抽取了部分数据
2、未做标准化处理
3、没有删除其他影响的特征,比如row_id
在上面删除下row_id来再试一下
得出:预测准确率为: 0.013510419051980764
增加了一点,但是效果不明显,继续做标准化处理
'''
# 使用标准化处理和交叉验证网格搜索
std = StandardScaler()
# 这里无论是训练集还是测试集的特征值都需要做标准化处理
x_train = std.fit_transform(x_train)
# 这里不需要再调用fit,因为fit只是计算一些值,计算一遍之后就不需要了
x_test = std.transform(x_test)
knn = KNeighborsClassifier()
# 网格搜索
# 构造参数n_neighbors值进行搜索
param = {'n_neighbors':[2,5,10]}
gc = GridSearchCV(knn,param_grid = param,cv = 10)
# 传入训练集的特征值和目标值
gc.fit(x_train,y_train)
# 得出预算结果,通过测试集的特征值来预测
y_predict = gc.predict(x_test)
# 查看准确率,输入测试集的特征值和目标值
print('预测准确率为:',gc.score(x_test,y_test))
print('最好的结果:',gc.best_score_)
print('选择的模型为也就是n_neighbors值:',gc.best_estimator_)
'''
预测准确率为: 0.4069557362240289
最好的结果: 0.40099382623098934
选择的模型为也就是n_neighbors值: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=10, p=2,
weights='uniform')
这个相比未做标准化差别就很大了,但是准确率依然还是不够可以试试读取所有数据。
'''
if __name__ == "__main__":
knncls()
#注释很详细,这里不做说明。
朴素贝叶斯算法实例
数据来源:Sklearn自带数据集
20newsgroups数据集是用于文本分类、文本挖据和信息检索研究的国际标准数据集之一。
数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合。
实例:
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
# 分词
from sklearn.feature_extraction.text import TfidfVectorizer
#朴素贝叶斯算法
from sklearn.naive_bayes import MultinomialNB
def naviebayes():
'''
朴树贝叶斯算法实例
'''
# 读取数据
news = fetch_20newsgroups(subset='all')
# 数据分割
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25)
# 分词用TfidfVectorizer
tf = TfidfVectorizer()
# 用训练集分词统计词的重要性
x_train = tf.fit_transform(x_train)
x_test = tf.transform(x_test)
# 使用朴素贝叶斯算法预算
mlt = MultinomialNB(alpha=1.0)
mlt.fit(x_train,y_train)
y_predict = mlt.predict(x_test)
print('预算准确率为:',mlt.score(x_test,y_test))
'''
预算准确率为: 0.8433786078098472
'''
if __name__ == "__main__":
naviebayes()
其他
菜单右下角 诚意相册点一点。感谢!!