René's URL Explorer Experiment


Title: 树模型遇上类别型特征(Python) · Issue #49 · aialgorithm/Blog · GitHub

Open Graph Title: 树模型遇上类别型特征(Python) · Issue #49 · aialgorithm/Blog

X Title: 树模型遇上类别型特征(Python) · Issue #49 · aialgorithm/Blog

Description: 在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征。 对于xgboost等boosting树模型,基学习通常是cart回归树,而cart树的输入通常只支持连续型数值类型的,像年龄、收入等连续型变量Cart可以很好地处理,但对于无序的类别型变量(如 职业、地区等),cart树处理就麻烦些了,如果是直接暴力地枚举每种可能的类别型特征的组合,这样找类别特征划分点计算量也很容易就爆了。 在此,本文列举了 树模型对于类别型特征处理的常用方法,并做了...

Open Graph Description: 在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征。 对于xgboost等boosting树模型,基学习通常是cart回归树,而cart树的输入通常只支持连续型数值类型的,像年龄、收入等连续型变量Cart可以很好地处理,但对于无序的类别型变量(如 职业、地区等),cart树处理就麻烦些了,如果是直接暴力地枚举每种可能的类别型特征的组合,这样找类别特征划分点计算...

X Description: 在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征。 对于xgboost等boosting树模型,基学习通常是cart回归树,而cart树的输入通常只支持连续型数值类型的,像年龄、收入等连续型变量Cart可以很好地处理,但对于无序的类别型变量(如 职业、地区等),cart树处理就麻烦些了,如果是直接暴力地枚举每种可能的类别型特征的组合,这样找类别特征划分点计算...

Opengraph URL: https://github.com/aialgorithm/Blog/issues/49

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"树模型遇上类别型特征(Python)","articleBody":"\r\n在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征。\r\n\r\n对于xgboost等boosting树模型,基学习通常是cart回归树,而cart树的输入通常只支持连续型数值类型的,像年龄、收入等连续型变量Cart可以很好地处理,但对于无序的类别型变量(如 职业、地区等),cart树处理就麻烦些了,如果是直接暴力地枚举每种可能的[类别型特征的组合](https://stackoverflow.com/questions/46391632/cart-algorithm-why-2m-1-1-splits-for-categorical-variables),这样找类别特征划分点计算量也很容易就爆了。\r\n\r\n在此,本文列举了 树模型对于类别型特征处理的常用方法,并做了深入探讨~\r\n\r\n### 一、one-hot编码处理\r\n![](https://upload-images.jianshu.io/upload_images/11682271-fbf6394e5f6c35b4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\r\n我们可以直接对类别型特征做Onehot处理(这也是最常用的做法),每一类别的取值都用单独一位0/1来表示, 也就是一个“性别”类别特征可以转换为是否为“男”、“女” 或者“其他” 来表示,如下:\r\n\r\n\r\n![](https://upload-images.jianshu.io/upload_images/11682271-2b2772ec3cda78bc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\r\n\r\n```\r\ndisplay(df.loc[:,['Gender_Code']].head())\r\n\r\n# onehot \r\npd.get_dummies(df['Gender_Code']).head()\r\n```\r\n但是onehot的重大缺点在于,对于取值很多的类别型特征,可能导致高维稀疏特征而容易导致树模型的过拟合。如之前谈到面对高维稀疏的onehot特征,一旦有达到划分条件,树模型容易加深、切分次数越多,相应每个切分出的子特征空间的统计信息越来越小,学习到的可能只是噪音(即 过拟合)。\r\n\r\n**使用建议**:Onehot天然适合神经网络模型,神经网络很容易从高维稀疏特征学习到低微稠密的表示。当onehot用于树模型时,类别型特征的取值数量少的时候还是可以学习到比较重要的交互特征,但是当取值很多时候(如 大于100),容易导致过拟合,是不太适合用onehot+树模型的。 \r\n![](https://upload-images.jianshu.io/upload_images/11682271-c8e2d2306626ea61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\r\n(注:此外 onehot 还有增加内存开销以及训练时间开销等缺点)\r\n\r\n### 二、  Ordinal Encoder\r\n\r\nOrdinalEncoder也称为顺序编码 (与 label encoding,两者功能基本一样),特征/标签被转换为序数整数(0 到 n_categories - 1)\r\n\r\n**使用建议**:适用于ordinal feature ,也就是虽然类别型特征,但它存在内在顺序,比如衣服尺寸“S”,“M”, “L”等特征就适合从小到大进行整数编码。\r\n![](https://upload-images.jianshu.io/upload_images/11682271-9f6e9cb2f5e0560c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\r\n\r\n```\r\nfrom sklearn.preprocessing import  LabelEncoder\r\n encoder = LabelEncoder()\r\n df[col] = encoder.transform(df[col])\r\n```\r\n\r\n### 三、target encoding\r\n\r\ntarget encoding 目标编码也称为均值编码,是借助各类别特征对应的标签信息做编码(比如二分类 简单以类别特征各取值 的样本对应标签值“0/1”的平均值),是一种常用有监督编码方法(此外还有经典的WoE编码),很适合逻辑回归等弱模型使用。\r\n\r\n\r\n**使用建议** : 当树模型使用目标编码,需加入些正则化技巧,减少Target encoding方法带来的条件偏移的现象(当训练数据集和测试数据集数据结构和分布不一样的时候会出条件偏移问题),主流的方法是使用Catboost编码 或者 使用cross-validation求出target mean或bayesian mean。\r\n\r\n![](https://upload-images.jianshu.io/upload_images/11682271-6336a0164e29ff00.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\r\n\r\n```\r\n# 如下简单的target  mean代码。也可以用:from category_encoders import TargetEncoder \r\n\r\ntarget_encode_columns = ['Gender_Code']\r\ntarget = ['y']\r\n\r\ntarget_encode_df = score_df[target_encode_columns + target].reset_index().drop(columns = 'index', axis = 1)\r\ntarget_name = target[0]\r\ntarget_df = pd.DataFrame()\r\nfor embed_col in target_encode_columns:\r\n    val_map = target_encode_df.groupby(embed_col)[target].mean().to_dict()[target_name]\r\n    target_df[embed_col] = target_encode_df[embed_col].map(val_map).values\r\n    \r\nscore_target_drop = score_df.drop(target_encode_columns, axis = 1).reset_index().drop(columns = 'index', axis = 1)\r\nscore_target = pd.concat([score_target_drop, target_df], axis = 1)\r\n```\r\n### 四、CatBoostEncoder\r\nCatBoostEncoder是CatBoost模型处理类别变量的方法(Ordered TS编码),在于目标编码的基础上减少条件偏移。其计算公式为:\r\n![](https://upload-images.jianshu.io/upload_images/11682271-ce8006c3e47627e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\r\n- TargetCount : 对于指定类别特征在target value的总和\r\n- prior:对于整个数据集而言,target值的总和/所有的观测变量数目\r\n- FeatureCount:观测的特征列表在整个数据集中的出现次数。\r\n```\r\nCBE_encoder = CatBoostEncoder()\r\ntrain_cbe = CBE_encoder.fit_transform(train[feature_list], target)\r\ntest_cbe = CBE_encoder.transform(test[feature_list])\r\n```\r\n\r\n### 五、CountEncoder\r\n也称为频数编码,将类别特征各取值转换为其在训练集出现的频率,这样做直观上就是会以类别取值的频次为依据 划分高频类别和低频类别。至于效果,还是要结合业务和实际场景。\r\n```\r\n## 也可以直接 from category_encoders import  CountEncoder\r\n\r\nbm = []\r\ntmp_df=train_df\r\nfor k in catefeas:\r\n    t = pd.DataFrame(tmp_df[k].value_counts(dropna=True,normalize=True)) # 频率\r\n    t.columns=[k+'vcount']\r\n    bm.append(t)\r\nfor k,j in zip(catefeas, range(len(catefeas))):# 联结编码\r\n    df = df.merge(bm[j], left_on=k, right_index=True,how='left')\r\n```\r\n### 六、 神经网络embedding\r\n当类别的取值数量很多时(onehot高维),如果直接onehot,从性能或效果来看都会比较差,这时通过神经网络embedding是不错的方法,将类别变量onehot输入神经网络学习一个低维稠密的向量,如经典的无监督词向量表征学习word2vec 或者 基于有监督神经网络编码。\r\n\r\n**使用建议**:特别适合类别变量取值很多,onehot后高维稀疏,再做NN低维表示转换后应用于树模型。\r\n![](https://upload-images.jianshu.io/upload_images/11682271-0591d6d3fa852d87.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\r\n\r\n```\r\n# word2vec\r\nfrom gensim.models import word2vec\r\n# 加载数据\r\nraw_sentences = [\"the quick brown fox jumps over the lazy dogs\",\"yoyoyo you go home now to sleep\"]\r\n# 切分词汇\r\nsentences= [s.encode('utf-8').split() for s in sentences]\r\n\r\n# 构建模型\r\nmodel = word2vec.Word2Vec(sentences,size=10)  # 词向量的维数为10\r\n\r\n#  各单词学习的词向量\r\nmodel['dogs']  \r\n# array([-0.00449447, -0.00310097,  0.02421786, ...], dtype=float32)\r\n\r\n```\r\n###  七、lgb类别特征处理\r\n\r\n为了解决one-hot编码(one vs many )处理类别特征的不足。lgb采用了Many vs many的切分方式,简单来说,是通过对每个类别取值进行数值编码(类似于目标编码),根据编码的数值寻找较优切分点,实现了类别特征集合的较优切分。\r\n![](https://upload-images.jianshu.io/upload_images/11682271-124521af4f6b31f2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\r\n\r\n\r\n- 具体算法原理:\r\n\r\n1 、特征取值数目小于等于4(参数max_cat_to_onehot):直接onehot 编码,逐个扫描每一个bin容器,找出最佳分裂点; \r\n\r\n2、 特征取值数目大于4: max bin的默认值是256 取值的个数大于max bin数时,会筛掉出现频次少的取值。再统计各个特征值对应的样本的一阶梯度之和,二阶梯度之和,以一阶梯度之和 / (二阶梯度之和 + 正则化系数)作为该特征取值的编码。将类别转化为数值编码后,从大到小排序,遍历直方图寻找最优的切分点\r\n\r\n\u003e简单来说,Lightgbm利用梯度统计信息对类别特征编码。我个人的理解是这样可以按照学习的难易程度为依据划分类别特征组,比如某特征一共有【狼、狗、猫、猪、兔】五种类别取值,而【狼、狗】类型下的样本分类难度相当高(该特征取值下的梯度大),在梯度编码后的类别特征上,寻找较优划分点可能就是【狼、狗】|vs|【猫、猪、兔】\r\n**使用建议:**  通常使用lgb类别特征处理,效果是优于one-hot encoding。\r\n\r\n\r\n```\r\n# lgb类别处理:简单转化为类别型特征直接输入Lgb模型训练即可。\r\n for ft in category_list:\r\n        train_x[ft] = train_x[ft].astype('category')\r\nclf = LGBMClassifier(**best_params)\r\nclf.fit(train_x, train_y)\r\n````\r\n\r\n\r\n### 经验小结\r\n\r\n- 对于取值数量很少(\u003c10)的类别型特征,相应的各取值下的样本数量也比较多,可以直接Onehot编码。\r\n\r\n- 对于取值数量比较多(10到几百),这时onehot从效率或者效果,都不及lightgbm梯度编码或catboost目标编码,而且直接使用也很方便。(需要注意的是,个人实践中这两种方法在很多取值的类别特征,还是比较容易过拟合。这时,类别值先做下经验的合并或者尝试剔除某些类别特征后,模型效果反而会更好)\r\n\r\n- 当几百上千的类别取值,可以先onehot后(高维稀疏),借助神经网络模型做低维稠密表示。\r\n\r\n以上就是主要的树模型对类别特征编码方法。实际工程上面的效果,还需具体验证。计算资源丰富的情况下,可以多试几种编码方法,再做特征选择,选取比较有效的特征,效果杠杠的。\r\n\r\n\r\n(END)\r\n---\r\n文章首发公众号“算法进阶”,欢迎关注。公众号阅读原文可访问文章[相关代码及资料](https://github.com/aialgorithm/Blog)\r\n\r\n\r\n\r\n\r\n","author":{"url":"https://github.com/aialgorithm","@type":"Person","name":"aialgorithm"},"datePublished":"2022-04-15T09:10:24.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/49/Blog/issues/49"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:ffb710cd-b278-3156-1d18-20d04c3d89a0
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-id9296:87739:46ECF0:644B36:696A1666
html-safe-nonce182bbd1e681c85287d7c2706daa110b8e95f61f28eb397905b695615c599a154
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5Mjk2Ojg3NzM5OjQ2RUNGMDo2NDRCMzY6Njk2QTE2NjYiLCJ2aXNpdG9yX2lkIjoiNTM4NDA1NDY0MDQ4NTIwOTcwMiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacc1bf79ef30f2660808c1007fe703ac5e01e5922e8aa7ff224184f6851e8e4168
hovercard-subject-tagissue:1205416674
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/aialgorithm/Blog/49/issue_layout
twitter:imagehttps://opengraph.githubassets.com/0cfebb3496f0e415643abe82c85d0450b45aac3be77e6f663605e6d5d49e9318/aialgorithm/Blog/issues/49
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/0cfebb3496f0e415643abe82c85d0450b45aac3be77e6f663605e6d5d49e9318/aialgorithm/Blog/issues/49
og:image:alt在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征。 对于xgboost等boosting树模型,基学习通常是cart回归树,而cart树的输入通常只支持连续型数值类型的,像年龄、收入等连续型变量Cart可以很好地处理,但对于无序的类别型变量(如 职业、地区等),cart树处理就麻烦些了,如果是直接暴力地枚举每种可能的类别型特征的组合,这样找类别特征划分点计算...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernameaialgorithm
hostnamegithub.com
expected-hostnamegithub.com
None34a52bd10bd674f68e5c1b6b74413b79bf2ca20c551055ace3f7cdd112803923
turbo-cache-controlno-preview
go-importgithub.com/aialgorithm/Blog git https://github.com/aialgorithm/Blog.git
octolytics-dimension-user_id33707637
octolytics-dimension-user_loginaialgorithm
octolytics-dimension-repository_id147093233
octolytics-dimension-repository_nwoaialgorithm/Blog
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id147093233
octolytics-dimension-repository_network_root_nwoaialgorithm/Blog
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releasee8bd37502700f365b18a4d39acf7cb7947e11b1a
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/aialgorithm/Blog/issues/49#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Faialgorithm%2FBlog%2Fissues%2F49
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Faialgorithm%2FBlog%2Fissues%2F49
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=aialgorithm%2FBlog
Reloadhttps://github.com/aialgorithm/Blog/issues/49
Reloadhttps://github.com/aialgorithm/Blog/issues/49
Reloadhttps://github.com/aialgorithm/Blog/issues/49
aialgorithm https://github.com/aialgorithm
Bloghttps://github.com/aialgorithm/Blog
Notifications https://github.com/login?return_to=%2Faialgorithm%2FBlog
Fork 259 https://github.com/login?return_to=%2Faialgorithm%2FBlog
Star 942 https://github.com/login?return_to=%2Faialgorithm%2FBlog
Code https://github.com/aialgorithm/Blog
Issues 66 https://github.com/aialgorithm/Blog/issues
Pull requests 0 https://github.com/aialgorithm/Blog/pulls
Actions https://github.com/aialgorithm/Blog/actions
Projects 0 https://github.com/aialgorithm/Blog/projects
Security Uh oh! There was an error while loading. Please reload this page. https://github.com/aialgorithm/Blog/security
Please reload this pagehttps://github.com/aialgorithm/Blog/issues/49
Insights https://github.com/aialgorithm/Blog/pulse
Code https://github.com/aialgorithm/Blog
Issues https://github.com/aialgorithm/Blog/issues
Pull requests https://github.com/aialgorithm/Blog/pulls
Actions https://github.com/aialgorithm/Blog/actions
Projects https://github.com/aialgorithm/Blog/projects
Security https://github.com/aialgorithm/Blog/security
Insights https://github.com/aialgorithm/Blog/pulse
New issuehttps://github.com/login?return_to=https://github.com/aialgorithm/Blog/issues/49
New issuehttps://github.com/login?return_to=https://github.com/aialgorithm/Blog/issues/49
树模型遇上类别型特征(Python)https://github.com/aialgorithm/Blog/issues/49#top
https://github.com/aialgorithm
https://github.com/aialgorithm
aialgorithmhttps://github.com/aialgorithm
on Apr 15, 2022https://github.com/aialgorithm/Blog/issues/49#issue-1205416674
类别型特征的组合https://stackoverflow.com/questions/46391632/cart-algorithm-why-2m-1-1-splits-for-categorical-variables
https://camo.githubusercontent.com/eaf1aa05d1da8c732daca12f5cc3db4b7497373f65e8c4c477ccbd2113ce5493/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f31313638323237312d666266363339346535663663333562342e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
https://camo.githubusercontent.com/71ddf3534223b3457fc59bd6a6de997bac4cff4189e252068ae75d1633c455c3/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f31313638323237312d326232373732656333636461373862632e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
https://camo.githubusercontent.com/135a1205b6cf4df807203153896eeb6b005fe7d9b5b0790e25785e644c769ada/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f31313638323237312d633865326432333036363236656136312e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
https://camo.githubusercontent.com/76ff7edaad2bb58f65fe937862129110e4515a966a93b2d3f8fab21a75527f95/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f31313638323237312d396636653963623266356530353630632e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
https://camo.githubusercontent.com/b5e3c121f0a7bd513cecc639d934f0213e4faf7317248efee0b3bf22b6533d6a/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f31313638323237312d363333366130313634653239666630302e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
https://camo.githubusercontent.com/05dcdb751ba3f81f83f347bb14a8a984dbdd3e5f16a9145d939fe8c7cc47177a/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f31313638323237312d636538303036633365343736323765362e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
https://camo.githubusercontent.com/abe8503de63b9a00f6d0ba04c77f0c9dade917904a777dffa5ddb965594912ea/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f31313638323237312d303539316436643366613835326438372e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
https://camo.githubusercontent.com/6102d2679bf4d68af7cfa4062fd08e8b54b169563d193214a9432df7f9fb5200/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f31313638323237312d313234353231616634663662333166322e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
相关代码及资料https://github.com/aialgorithm/Blog
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.