{ "cells": [ { "cell_type": "markdown", "id": "8f9c5803", "metadata": {}, "source": [ "# 调优自动特征工程\n", "在`自动特征工程`中,我们的df字段类型都是由woodwork自动推断的,几乎是完全自动化的过程。 \n", "\n", "我们需要对字段类型引入更多的人为设置\n", "- 时间序列\n", "- 自定义原语\n", "- 类型纠正" ] }, { "cell_type": "markdown", "id": "b1603941", "metadata": {}, "source": [ "## 导入" ] }, { "cell_type": "code", "execution_count": 1, "id": "53cfceb5", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\63517\\miniconda3\\envs\\data-analysis\\lib\\site-packages\\woodwork\\__init__.py:2: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", " import pkg_resources\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "ft: 1.31.0, ww: 0.31.0\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import featuretools as ft\n", "import woodwork as ww\n", "from woodwork.column_schema import ColumnSchema\n", "from woodwork.logical_types import NaturalLanguage, Datetime,Boolean\n", "from featuretools.primitives import AggregationPrimitive, TransformPrimitive\n", "from featuretools.tests.testing_utils import make_ecommerce_entityset\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "import gc\n", "gc.enable()\n", "\n", "print(f'ft: {ft.__version__}, ww: {ww.__version__}')" ] }, { "cell_type": "code", "execution_count": 2, "id": "8d5ae2c6", "metadata": {}, "outputs": [], "source": [ "application_train = pd.read_csv('data/application_train.csv')\n", "application_test = pd.read_csv('data/application_test.csv')\n", "bureau = pd.read_csv('data/bureau.csv')\n", "bureau_balance = pd.read_csv('data/bureau_balance.csv')\n", "credit_card_balance = pd.read_csv('data/credit_card_balance.csv')\n", "installments_payments = pd.read_csv('data/installments_payments.csv')\n", "previous_application = pd.read_csv('data/previous_application.csv')\n", "pos_cash_balance = pd.read_csv('data/POS_CASH_balance.csv')\n" ] }, { "cell_type": "markdown", "id": "fa37c3c1", "metadata": {}, "source": [ "为了验证我们的处理过程,必须先抽样一些。" ] }, { "cell_type": "code", "execution_count": 3, "id": "89412ef7", "metadata": {}, "outputs": [], "source": [ "# application_train = application_train.iloc[:1000, :]\n", "# application_test = application_test.iloc[:1000, :]\n", "# bureau = bureau.iloc[:1000, :]\n", "# bureau_balance = bureau_balance.iloc[:1000, :]\n", "# credit_card_balance = credit_card_balance.iloc[:1000, :]\n", "# installments_payments = installments_payments.iloc[:1000, :]\n", "# previous_application = previous_application.iloc[:1000, :]\n", "# pos_cash_balance = pos_cash_balance.iloc[:1000, :]" ] }, { "cell_type": "code", "execution_count": 4, "id": "753cff39", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(307511, 123) (48744, 123)\n" ] } ], "source": [ "application_train['set'] = 'train'\n", "application_test['set'] = 'test'\n", "application_test['TARGET'] = np.nan\n", "print(application_train.shape, application_test.shape)\n", "app = pd.concat([application_train, application_test], ignore_index=True)\n", "\n", "app_target = app[['SK_ID_CURR', 'TARGET']]\n", "app_set = app[['SK_ID_CURR', 'set']]\n", "app = app.drop(columns=['set'])" ] }, { "cell_type": "code", "execution_count": 5, "id": "6f6df720", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([dtype('int64'), dtype('O'), dtype('float64')], dtype=object)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "application_train.dtypes.unique()" ] }, { "cell_type": "code", "execution_count": 6, "id": "5f862c3b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ww.logical_types" ] }, { "cell_type": "markdown", "id": "da4e6346", "metadata": {}, "source": [ "## woodwork认识:\n", "- 物理类型\n", "- 逻辑类型:\n", "- 语义标签:额外数据含义\n", "\n", "逻辑类型是必须的, 语义标签是可选的" ] }, { "cell_type": "markdown", "id": "d0f67ff7", "metadata": {}, "source": [ "woodwork使用了Pandas 的 Accessor机制,这是扩展接口,在`import featuretools`时候,就把ww加上去了" ] }, { "cell_type": "markdown", "id": "f58f07b0", "metadata": {}, "source": [ "woodwork初始时候会为其添加逻辑类型,语义标签" ] }, { "cell_type": "markdown", "id": "99ee10d5", "metadata": {}, "source": [ "### 语义标签" ] }, { "cell_type": "code", "execution_count": 7, "id": "7e483877", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameis_standard_tagvalid_logical_types
0numericTrue[Age, AgeFractional, AgeNullable, Double, Inte...
1categoryTrue[Categorical, CountryCode, CurrencyCode, Ordin...
2indexFalseAny LogicalType
3time_indexFalse[Datetime, Age, AgeFractional, AgeNullable, Do...
4date_of_birthFalse[Datetime]
5ignoreFalseAny LogicalType
6passthroughFalseAny LogicalType
\n", "
" ], "text/plain": [ " name is_standard_tag \\\n", "0 numeric True \n", "1 category True \n", "2 index False \n", "3 time_index False \n", "4 date_of_birth False \n", "5 ignore False \n", "6 passthrough False \n", "\n", " valid_logical_types \n", "0 [Age, AgeFractional, AgeNullable, Double, Inte... \n", "1 [Categorical, CountryCode, CurrencyCode, Ordin... \n", "2 Any LogicalType \n", "3 [Datetime, Age, AgeFractional, AgeNullable, Do... \n", "4 [Datetime] \n", "5 Any LogicalType \n", "6 Any LogicalType " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ww.list_semantic_tags()" ] }, { "cell_type": "markdown", "id": "32346c1a", "metadata": {}, "source": [ "- `numeric`, `category` 标准语义标签和特定的逻辑类型关联\n", "- `index`,`time_index` woodwork为一些索引列添加标签,表明一些含义\n", "- `date_of_birth` 表明应该解释为出生日期\n", "- `ignore`,`passthrough` 应该被忽略,在ft过程中" ] }, { "cell_type": "markdown", "id": "0dd57169", "metadata": {}, "source": [ "我们应该添加额外标签帮助解释" ] }, { "cell_type": "markdown", "id": "fc026c70", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "63adac94", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "bc7408b2", "metadata": {}, "source": [ "### 逻辑类型" ] }, { "cell_type": "markdown", "id": "b5198407", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": 8, "id": "043232ce", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nametype_stringdescriptionphysical_typestandard_tagsis_default_typeis_registeredparent_type
0AddressaddressRepresents Logical Types that contain address ...string{}TrueTrueNone
1AgeageRepresents Logical Types that contain whole nu...int64{numeric}TrueTrueInteger
2AgeFractionalage_fractionalRepresents Logical Types that contain non-nega...float64{numeric}TrueTrueDouble
3AgeNullableage_nullableRepresents Logical Types that contain whole nu...Int64{numeric}TrueTrueIntegerNullable
4BooleanbooleanRepresents Logical Types that contain binary v...bool{}TrueTrueBooleanNullable
5BooleanNullableboolean_nullableRepresents Logical Types that contain binary v...boolean{}TrueTrueNone
6CategoricalcategoricalRepresents Logical Types that contain unordere...category{category}TrueTrueNone
7CountryCodecountry_codeRepresents Logical Types that use the ISO-3166...category{category}TrueTrueCategorical
8CurrencyCodecurrency_codeRepresents Logical Types that use the ISO-4217...category{category}TrueTrueCategorical
9DatetimedatetimeRepresents Logical Types that contain date and...datetime64[ns]{}TrueTrueNone
10DoubledoubleRepresents Logical Types that contain positive...float64{numeric}TrueTrueNone
11EmailAddressemail_addressRepresents Logical Types that contain email ad...string{}TrueTrueUnknown
12FilepathfilepathRepresents Logical Types that specify location...string{}TrueTrueNone
13IPAddressip_addressRepresents Logical Types that contain IP addre...string{}TrueTrueUnknown
14IntegerintegerRepresents Logical Types that contain positive...int64{numeric}TrueTrueIntegerNullable
15IntegerNullableinteger_nullableRepresents Logical Types that contain positive...Int64{numeric}TrueTrueNone
16LatLonglat_longRepresents Logical Types that contain latitude...object{}TrueTrueNone
17NaturalLanguagenatural_languageRepresents Logical Types that contain text or ...string{}TrueTrueNone
18OrdinalordinalRepresents Logical Types that contain ordered ...category{category}TrueTrueCategorical
19PersonFullNameperson_full_nameRepresents Logical Types that may contain firs...string{}TrueTrueNone
20PhoneNumberphone_numberRepresents Logical Types that contain numeric ...string{}TrueTrueUnknown
21PostalCodepostal_codeRepresents Logical Types that contain a series...category{category}TrueTrueCategorical
22SubRegionCodesub_region_codeRepresents Logical Types that use the ISO-3166...category{category}TrueTrueCategorical
23TimedeltatimedeltaRepresents Logical Types that contain values s...timedelta64[ns]{}TrueTrueUnknown
24URLurlRepresents Logical Types that contain URLs, wh...string{}TrueTrueUnknown
25UnknownunknownRepresents Logical Types that cannot be inferr...string{}TrueTrueNone
\n", "
" ], "text/plain": [ " name type_string \\\n", "0 Address address \n", "1 Age age \n", "2 AgeFractional age_fractional \n", "3 AgeNullable age_nullable \n", "4 Boolean boolean \n", "5 BooleanNullable boolean_nullable \n", "6 Categorical categorical \n", "7 CountryCode country_code \n", "8 CurrencyCode currency_code \n", "9 Datetime datetime \n", "10 Double double \n", "11 EmailAddress email_address \n", "12 Filepath filepath \n", "13 IPAddress ip_address \n", "14 Integer integer \n", "15 IntegerNullable integer_nullable \n", "16 LatLong lat_long \n", "17 NaturalLanguage natural_language \n", "18 Ordinal ordinal \n", "19 PersonFullName person_full_name \n", "20 PhoneNumber phone_number \n", "21 PostalCode postal_code \n", "22 SubRegionCode sub_region_code \n", "23 Timedelta timedelta \n", "24 URL url \n", "25 Unknown unknown \n", "\n", " description physical_type \\\n", "0 Represents Logical Types that contain address ... string \n", "1 Represents Logical Types that contain whole nu... int64 \n", "2 Represents Logical Types that contain non-nega... float64 \n", "3 Represents Logical Types that contain whole nu... Int64 \n", "4 Represents Logical Types that contain binary v... bool \n", "5 Represents Logical Types that contain binary v... boolean \n", "6 Represents Logical Types that contain unordere... category \n", "7 Represents Logical Types that use the ISO-3166... category \n", "8 Represents Logical Types that use the ISO-4217... category \n", "9 Represents Logical Types that contain date and... datetime64[ns] \n", "10 Represents Logical Types that contain positive... float64 \n", "11 Represents Logical Types that contain email ad... string \n", "12 Represents Logical Types that specify location... string \n", "13 Represents Logical Types that contain IP addre... string \n", "14 Represents Logical Types that contain positive... int64 \n", "15 Represents Logical Types that contain positive... Int64 \n", "16 Represents Logical Types that contain latitude... object \n", "17 Represents Logical Types that contain text or ... string \n", "18 Represents Logical Types that contain ordered ... category \n", "19 Represents Logical Types that may contain firs... string \n", "20 Represents Logical Types that contain numeric ... string \n", "21 Represents Logical Types that contain a series... category \n", "22 Represents Logical Types that use the ISO-3166... category \n", "23 Represents Logical Types that contain values s... timedelta64[ns] \n", "24 Represents Logical Types that contain URLs, wh... string \n", "25 Represents Logical Types that cannot be inferr... string \n", "\n", " standard_tags is_default_type is_registered parent_type \n", "0 {} True True None \n", "1 {numeric} True True Integer \n", "2 {numeric} True True Double \n", "3 {numeric} True True IntegerNullable \n", "4 {} True True BooleanNullable \n", "5 {} True True None \n", "6 {category} True True None \n", "7 {category} True True Categorical \n", "8 {category} True True Categorical \n", "9 {} True True None \n", "10 {numeric} True True None \n", "11 {} True True Unknown \n", "12 {} True True None \n", "13 {} True True Unknown \n", "14 {numeric} True True IntegerNullable \n", "15 {numeric} True True None \n", "16 {} True True None \n", "17 {} True True None \n", "18 {category} True True Categorical \n", "19 {} True True None \n", "20 {} True True Unknown \n", "21 {category} True True Categorical \n", "22 {category} True True Categorical \n", "23 {} True True Unknown \n", "24 {} True True Unknown \n", "25 {} True True None " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ww.list_logical_types()" ] }, { "cell_type": "markdown", "id": "db42ecaf", "metadata": {}, "source": [ "#### unknown类型\n", "当woodwork类型推导没能成功,就设置`unknown`. 我们可以手动设置他" ] }, { "cell_type": "markdown", "id": "9d45248f", "metadata": {}, "source": [ "比如, 下面例子,国家代码没有推导类型成功,就设置了Unknown. 我们可以手动设置`CountryCode`" ] }, { "cell_type": "code", "execution_count": 9, "id": "aab23290", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(['AU', 'US', 'UA'])\n", "unkown_series = ww.init_series(s)\n", "unkown_series.ww" ] }, { "cell_type": "code", "execution_count": 10, "id": "ff9fe108", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "countrycode_series = ww.init_series(unkown_series, 'CountryCode')\n", "countrycode_series.ww" ] }, { "cell_type": "markdown", "id": "0b10bd73", "metadata": {}, "source": [ "key" ] }, { "cell_type": "markdown", "id": "fa5be036", "metadata": {}, "source": [ "#### IntegerNullable \n", "表明是整数,但是可能会有空值,要小心" ] }, { "cell_type": "code", "execution_count": 11, "id": "932e1f2b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "series = pd.Series([1, 2, None, 4], dtype=\"Int64\")\n", "intn_series = ww.init_series(series)\n", "intn_series.ww" ] }, { "cell_type": "markdown", "id": "9d95ca2b", "metadata": {}, "source": [ "#### ordinal 有序类型\n", "评分,排名等" ] }, { "cell_type": "markdown", "id": "7b5f1fcc", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "6f50eb2e", "metadata": {}, "source": [ "## ww处理" ] }, { "cell_type": "markdown", "id": "abaa5b97", "metadata": {}, "source": [ "我们根据自动推导的,在进行微调" ] }, { "cell_type": "markdown", "id": "537c9d9a", "metadata": {}, "source": [ "### application" ] }, { "cell_type": "markdown", "id": "050ce50a", "metadata": {}, "source": [ "对于set和target这样的标签,我们手动处理,即不让进入ft过程" ] }, { "cell_type": "code", "execution_count": 12, "id": "7703110b", "metadata": {}, "outputs": [], "source": [ "app.ww.init(name= 'app', index='SK_ID_CURR')" ] }, { "cell_type": "code", "execution_count": 13, "id": "afe0ca90", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'app'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "app.ww.name" ] }, { "cell_type": "code", "execution_count": 14, "id": "dfdfecb4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Logical TypeSemantic Tag(s)
Column
SK_ID_CURRInteger['index']
TARGETIntegerNullable['numeric']
NAME_CONTRACT_TYPECategorical['category']
CODE_GENDERCategorical['category']
FLAG_OWN_CARBoolean[]
FLAG_OWN_REALTYBoolean[]
CNT_CHILDRENInteger['numeric']
AMT_INCOME_TOTALDouble['numeric']
AMT_CREDITDouble['numeric']
AMT_ANNUITYDouble['numeric']
AMT_GOODS_PRICEDouble['numeric']
NAME_TYPE_SUITECategorical['category']
NAME_INCOME_TYPECategorical['category']
NAME_EDUCATION_TYPECategorical['category']
NAME_FAMILY_STATUSCategorical['category']
NAME_HOUSING_TYPECategorical['category']
REGION_POPULATION_RELATIVEDouble['numeric']
DAYS_BIRTHInteger['numeric']
DAYS_EMPLOYEDInteger['numeric']
DAYS_REGISTRATIONDouble['numeric']
DAYS_ID_PUBLISHInteger['numeric']
OWN_CAR_AGEIntegerNullable['numeric']
FLAG_MOBILInteger['numeric']
FLAG_EMP_PHONEInteger['numeric']
FLAG_WORK_PHONEInteger['numeric']
FLAG_CONT_MOBILEInteger['numeric']
FLAG_PHONEInteger['numeric']
FLAG_EMAILInteger['numeric']
OCCUPATION_TYPECategorical['category']
CNT_FAM_MEMBERSDouble['numeric']
REGION_RATING_CLIENTInteger['numeric']
REGION_RATING_CLIENT_W_CITYInteger['numeric']
WEEKDAY_APPR_PROCESS_STARTCategorical['category']
HOUR_APPR_PROCESS_STARTInteger['numeric']
REG_REGION_NOT_LIVE_REGIONInteger['numeric']
REG_REGION_NOT_WORK_REGIONInteger['numeric']
LIVE_REGION_NOT_WORK_REGIONInteger['numeric']
REG_CITY_NOT_LIVE_CITYInteger['numeric']
REG_CITY_NOT_WORK_CITYInteger['numeric']
LIVE_CITY_NOT_WORK_CITYInteger['numeric']
ORGANIZATION_TYPECategorical['category']
EXT_SOURCE_1Double['numeric']
EXT_SOURCE_2Double['numeric']
EXT_SOURCE_3Double['numeric']
APARTMENTS_AVGDouble['numeric']
BASEMENTAREA_AVGDouble['numeric']
YEARS_BEGINEXPLUATATION_AVGDouble['numeric']
YEARS_BUILD_AVGDouble['numeric']
COMMONAREA_AVGDouble['numeric']
ELEVATORS_AVGDouble['numeric']
ENTRANCES_AVGDouble['numeric']
FLOORSMAX_AVGDouble['numeric']
FLOORSMIN_AVGDouble['numeric']
LANDAREA_AVGDouble['numeric']
LIVINGAPARTMENTS_AVGDouble['numeric']
LIVINGAREA_AVGDouble['numeric']
NONLIVINGAPARTMENTS_AVGDouble['numeric']
NONLIVINGAREA_AVGDouble['numeric']
APARTMENTS_MODEDouble['numeric']
BASEMENTAREA_MODEDouble['numeric']
YEARS_BEGINEXPLUATATION_MODEDouble['numeric']
YEARS_BUILD_MODEDouble['numeric']
COMMONAREA_MODEDouble['numeric']
ELEVATORS_MODEDouble['numeric']
ENTRANCES_MODEDouble['numeric']
FLOORSMAX_MODEDouble['numeric']
FLOORSMIN_MODEDouble['numeric']
LANDAREA_MODEDouble['numeric']
LIVINGAPARTMENTS_MODEDouble['numeric']
LIVINGAREA_MODEDouble['numeric']
NONLIVINGAPARTMENTS_MODEDouble['numeric']
NONLIVINGAREA_MODEDouble['numeric']
APARTMENTS_MEDIDouble['numeric']
BASEMENTAREA_MEDIDouble['numeric']
YEARS_BEGINEXPLUATATION_MEDIDouble['numeric']
YEARS_BUILD_MEDIDouble['numeric']
COMMONAREA_MEDIDouble['numeric']
ELEVATORS_MEDIDouble['numeric']
ENTRANCES_MEDIDouble['numeric']
FLOORSMAX_MEDIDouble['numeric']
FLOORSMIN_MEDIDouble['numeric']
LANDAREA_MEDIDouble['numeric']
LIVINGAPARTMENTS_MEDIDouble['numeric']
LIVINGAREA_MEDIDouble['numeric']
NONLIVINGAPARTMENTS_MEDIDouble['numeric']
NONLIVINGAREA_MEDIDouble['numeric']
FONDKAPREMONT_MODECategorical['category']
HOUSETYPE_MODECategorical['category']
TOTALAREA_MODEDouble['numeric']
WALLSMATERIAL_MODECategorical['category']
EMERGENCYSTATE_MODEBooleanNullable[]
OBS_30_CNT_SOCIAL_CIRCLEIntegerNullable['numeric']
DEF_30_CNT_SOCIAL_CIRCLEIntegerNullable['numeric']
OBS_60_CNT_SOCIAL_CIRCLEIntegerNullable['numeric']
DEF_60_CNT_SOCIAL_CIRCLEIntegerNullable['numeric']
DAYS_LAST_PHONE_CHANGEIntegerNullable['numeric']
FLAG_DOCUMENT_2Integer['numeric']
FLAG_DOCUMENT_3Integer['numeric']
FLAG_DOCUMENT_4Integer['numeric']
FLAG_DOCUMENT_5Integer['numeric']
FLAG_DOCUMENT_6Integer['numeric']
FLAG_DOCUMENT_7Integer['numeric']
FLAG_DOCUMENT_8Integer['numeric']
FLAG_DOCUMENT_9Integer['numeric']
FLAG_DOCUMENT_10Integer['numeric']
FLAG_DOCUMENT_11Integer['numeric']
FLAG_DOCUMENT_12Integer['numeric']
FLAG_DOCUMENT_13Integer['numeric']
FLAG_DOCUMENT_14Integer['numeric']
FLAG_DOCUMENT_15Integer['numeric']
FLAG_DOCUMENT_16Integer['numeric']
FLAG_DOCUMENT_17Integer['numeric']
FLAG_DOCUMENT_18Integer['numeric']
FLAG_DOCUMENT_19Integer['numeric']
FLAG_DOCUMENT_20Integer['numeric']
FLAG_DOCUMENT_21Integer['numeric']
AMT_REQ_CREDIT_BUREAU_HOURIntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_DAYIntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_WEEKIntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_MONIntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_QRTIntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_YEARIntegerNullable['numeric']
" ], "text/plain": [ " Logical Type Semantic Tag(s)\n", "Column \n", "SK_ID_CURR Integer ['index']\n", "TARGET IntegerNullable ['numeric']\n", "NAME_CONTRACT_TYPE Categorical ['category']\n", "CODE_GENDER Categorical ['category']\n", "FLAG_OWN_CAR Boolean []\n", "... ... ...\n", "AMT_REQ_CREDIT_BUREAU_DAY IntegerNullable ['numeric']\n", "AMT_REQ_CREDIT_BUREAU_WEEK IntegerNullable ['numeric']\n", "AMT_REQ_CREDIT_BUREAU_MON IntegerNullable ['numeric']\n", "AMT_REQ_CREDIT_BUREAU_QRT IntegerNullable ['numeric']\n", "AMT_REQ_CREDIT_BUREAU_YEAR IntegerNullable ['numeric']\n", "\n", "[122 rows x 2 columns]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "app.ww.schema" ] }, { "cell_type": "markdown", "id": "01a91083", "metadata": {}, "source": [ "2. flag, is_not 设置为bool" ] }, { "cell_type": "code", "execution_count": 15, "id": "efcd6141", "metadata": {}, "outputs": [], "source": [ "FLAG_DOCUMENTS = { f'FLAG_DOCUMENT_{i}':'Boolean' for i in range(2, 22)}\n", "app.ww.set_types(\n", " logical_types = {\n", " 'FLAG_MOBIL': 'Boolean',\n", " 'FLAG_EMP_PHONE': 'Boolean',\n", " 'FLAG_WORK_PHONE': 'Boolean',\n", " 'FLAG_CONT_MOBILE': 'Boolean',\n", " 'FLAG_EMAIL': 'Boolean',\n", " 'FLAG_PHONE': 'Boolean',\n", " 'REG_CITY_NOT_LIVE_CITY': 'Boolean',\n", " 'REG_CITY_NOT_WORK_CITY': 'Boolean',\n", " 'LIVE_CITY_NOT_WORK_CITY': 'Boolean',\n", " **FLAG_DOCUMENTS\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "d9dda836", "metadata": {}, "source": [ "3. 评级\n", "\n", "对于一些异常的,我们可以代替为np.nan, ft是不会处理的" ] }, { "cell_type": "code", "execution_count": 16, "id": "dc54daee", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2, 1, 3], dtype=int64)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "app['REGION_RATING_CLIENT'].unique()" ] }, { "cell_type": "code", "execution_count": 17, "id": "2e18938c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 2, 1, 3, -1], dtype=int64)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "app['REGION_RATING_CLIENT_W_CITY'].unique()" ] }, { "cell_type": "code", "execution_count": 18, "id": "26982b30", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "224393 -1\n", "Name: REGION_RATING_CLIENT_W_CITY, dtype: int64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "app['REGION_RATING_CLIENT_W_CITY'][app['REGION_RATING_CLIENT_W_CITY'] == -1]" ] }, { "cell_type": "code", "execution_count": 19, "id": "a2555083", "metadata": {}, "outputs": [], "source": [ "app['REGION_RATING_CLIENT_W_CITY'] = app['REGION_RATING_CLIENT_W_CITY'].replace(-1, np.nan)" ] }, { "cell_type": "code", "execution_count": 20, "id": "bfe0b59d", "metadata": {}, "outputs": [], "source": [ "app.ww.set_types(\n", " logical_types = {\n", " 'REGION_RATING_CLIENT': ww.logical_types.Ordinal(order=[1,2,3]),\n", " 'REGION_RATING_CLIENT_W_CITY': ww.logical_types.Ordinal(order=[1,2,3]),\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "c86746b3", "metadata": {}, "source": [ "4. 时间段,应该为分类" ] }, { "cell_type": "code", "execution_count": 21, "id": "eb3cb96b", "metadata": {}, "outputs": [], "source": [ "app.ww.set_types(\n", " logical_types = {\n", " 'HOUR_APPR_PROCESS_START': 'Categorical',\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "c3b771f9", "metadata": {}, "source": [ "### bureau" ] }, { "cell_type": "code", "execution_count": 22, "id": "7ca4a0c4", "metadata": {}, "outputs": [], "source": [ "bureau.ww.init(name= 'bureau', index='SK_ID_BUREAU')" ] }, { "cell_type": "code", "execution_count": 23, "id": "89e39f41", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Logical TypeSemantic Tag(s)
Column
SK_ID_CURRInteger['numeric']
SK_ID_BUREAUInteger['index']
CREDIT_ACTIVECategorical['category']
CREDIT_CURRENCYCategorical['category']
DAYS_CREDITInteger['numeric']
CREDIT_DAY_OVERDUEInteger['numeric']
DAYS_CREDIT_ENDDATEIntegerNullable['numeric']
DAYS_ENDDATE_FACTIntegerNullable['numeric']
AMT_CREDIT_MAX_OVERDUEDouble['numeric']
CNT_CREDIT_PROLONGInteger['numeric']
AMT_CREDIT_SUMDouble['numeric']
AMT_CREDIT_SUM_DEBTDouble['numeric']
AMT_CREDIT_SUM_LIMITDouble['numeric']
AMT_CREDIT_SUM_OVERDUEDouble['numeric']
CREDIT_TYPECategorical['category']
DAYS_CREDIT_UPDATEInteger['numeric']
AMT_ANNUITYDouble['numeric']
" ], "text/plain": [ " Logical Type Semantic Tag(s)\n", "Column \n", "SK_ID_CURR Integer ['numeric']\n", "SK_ID_BUREAU Integer ['index']\n", "CREDIT_ACTIVE Categorical ['category']\n", "CREDIT_CURRENCY Categorical ['category']\n", "DAYS_CREDIT Integer ['numeric']\n", "CREDIT_DAY_OVERDUE Integer ['numeric']\n", "DAYS_CREDIT_ENDDATE IntegerNullable ['numeric']\n", "DAYS_ENDDATE_FACT IntegerNullable ['numeric']\n", "AMT_CREDIT_MAX_OVERDUE Double ['numeric']\n", "CNT_CREDIT_PROLONG Integer ['numeric']\n", "AMT_CREDIT_SUM Double ['numeric']\n", "AMT_CREDIT_SUM_DEBT Double ['numeric']\n", "AMT_CREDIT_SUM_LIMIT Double ['numeric']\n", "AMT_CREDIT_SUM_OVERDUE Double ['numeric']\n", "CREDIT_TYPE Categorical ['category']\n", "DAYS_CREDIT_UPDATE Integer ['numeric']\n", "AMT_ANNUITY Double ['numeric']" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bureau.ww.schema" ] }, { "cell_type": "markdown", "id": "de36aef4", "metadata": {}, "source": [ "1. id不参与" ] }, { "cell_type": "code", "execution_count": 24, "id": "7a9b5874", "metadata": {}, "outputs": [], "source": [ "bureau.ww.set_types(semantic_tags={'SK_ID_CURR':'ignore'})" ] }, { "cell_type": "code", "execution_count": 25, "id": "1076d49e", "metadata": {}, "outputs": [], "source": [ "bureau_balance = bureau_balance.reset_index().rename(columns = {'index':'bureaubalance_index'})\n", "bureau_balance.ww.init(name='bureau_balance', index='bureaubalance_index')" ] }, { "cell_type": "code", "execution_count": 26, "id": "01680ee2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Logical TypeSemantic Tag(s)
Column
bureaubalance_indexInteger['index']
SK_ID_BUREAUInteger['numeric']
MONTHS_BALANCEInteger['numeric']
STATUSCategorical['category']
" ], "text/plain": [ " Logical Type Semantic Tag(s)\n", "Column \n", "bureaubalance_index Integer ['index']\n", "SK_ID_BUREAU Integer ['numeric']\n", "MONTHS_BALANCE Integer ['numeric']\n", "STATUS Categorical ['category']" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bureau_balance.ww.schema" ] }, { "cell_type": "code", "execution_count": 27, "id": "d310e71c", "metadata": {}, "outputs": [], "source": [ "bureau_balance.ww.set_types(semantic_tags={'SK_ID_BUREAU':'ignore'})" ] }, { "cell_type": "markdown", "id": "88214411", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "51861296", "metadata": {}, "source": [ "### previous" ] }, { "cell_type": "code", "execution_count": 28, "id": "06fd6728", "metadata": {}, "outputs": [], "source": [ "previous_application.ww.init(name='previous', index='SK_ID_PREV')" ] }, { "cell_type": "code", "execution_count": 29, "id": "adbf87cb", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Logical TypeSemantic Tag(s)
Column
SK_ID_PREVInteger['index']
SK_ID_CURRInteger['numeric']
NAME_CONTRACT_TYPECategorical['category']
AMT_ANNUITYDouble['numeric']
AMT_APPLICATIONDouble['numeric']
AMT_CREDITDouble['numeric']
AMT_DOWN_PAYMENTDouble['numeric']
AMT_GOODS_PRICEDouble['numeric']
WEEKDAY_APPR_PROCESS_STARTCategorical['category']
HOUR_APPR_PROCESS_STARTInteger['numeric']
FLAG_LAST_APPL_PER_CONTRACTBoolean[]
NFLAG_LAST_APPL_IN_DAYInteger['numeric']
RATE_DOWN_PAYMENTDouble['numeric']
RATE_INTEREST_PRIMARYDouble['numeric']
RATE_INTEREST_PRIVILEGEDDouble['numeric']
NAME_CASH_LOAN_PURPOSECategorical['category']
NAME_CONTRACT_STATUSCategorical['category']
DAYS_DECISIONInteger['numeric']
NAME_PAYMENT_TYPECategorical['category']
CODE_REJECT_REASONCategorical['category']
NAME_TYPE_SUITECategorical['category']
NAME_CLIENT_TYPECategorical['category']
NAME_GOODS_CATEGORYCategorical['category']
NAME_PORTFOLIOCategorical['category']
NAME_PRODUCT_TYPECategorical['category']
CHANNEL_TYPECategorical['category']
SELLERPLACE_AREAInteger['numeric']
NAME_SELLER_INDUSTRYCategorical['category']
CNT_PAYMENTIntegerNullable['numeric']
NAME_YIELD_GROUPCategorical['category']
PRODUCT_COMBINATIONCategorical['category']
DAYS_FIRST_DRAWINGIntegerNullable['numeric']
DAYS_FIRST_DUEIntegerNullable['numeric']
DAYS_LAST_DUE_1ST_VERSIONIntegerNullable['numeric']
DAYS_LAST_DUEIntegerNullable['numeric']
DAYS_TERMINATIONIntegerNullable['numeric']
NFLAG_INSURED_ON_APPROVALIntegerNullable['numeric']
" ], "text/plain": [ " Logical Type Semantic Tag(s)\n", "Column \n", "SK_ID_PREV Integer ['index']\n", "SK_ID_CURR Integer ['numeric']\n", "NAME_CONTRACT_TYPE Categorical ['category']\n", "AMT_ANNUITY Double ['numeric']\n", "AMT_APPLICATION Double ['numeric']\n", "AMT_CREDIT Double ['numeric']\n", "AMT_DOWN_PAYMENT Double ['numeric']\n", "AMT_GOODS_PRICE Double ['numeric']\n", "WEEKDAY_APPR_PROCESS_START Categorical ['category']\n", "HOUR_APPR_PROCESS_START Integer ['numeric']\n", "FLAG_LAST_APPL_PER_CONTRACT Boolean []\n", "NFLAG_LAST_APPL_IN_DAY Integer ['numeric']\n", "RATE_DOWN_PAYMENT Double ['numeric']\n", "RATE_INTEREST_PRIMARY Double ['numeric']\n", "RATE_INTEREST_PRIVILEGED Double ['numeric']\n", "NAME_CASH_LOAN_PURPOSE Categorical ['category']\n", "NAME_CONTRACT_STATUS Categorical ['category']\n", "DAYS_DECISION Integer ['numeric']\n", "NAME_PAYMENT_TYPE Categorical ['category']\n", "CODE_REJECT_REASON Categorical ['category']\n", "NAME_TYPE_SUITE Categorical ['category']\n", "NAME_CLIENT_TYPE Categorical ['category']\n", "NAME_GOODS_CATEGORY Categorical ['category']\n", "NAME_PORTFOLIO Categorical ['category']\n", "NAME_PRODUCT_TYPE Categorical ['category']\n", "CHANNEL_TYPE Categorical ['category']\n", "SELLERPLACE_AREA Integer ['numeric']\n", "NAME_SELLER_INDUSTRY Categorical ['category']\n", "CNT_PAYMENT IntegerNullable ['numeric']\n", "NAME_YIELD_GROUP Categorical ['category']\n", "PRODUCT_COMBINATION Categorical ['category']\n", "DAYS_FIRST_DRAWING IntegerNullable ['numeric']\n", "DAYS_FIRST_DUE IntegerNullable ['numeric']\n", "DAYS_LAST_DUE_1ST_VERSION IntegerNullable ['numeric']\n", "DAYS_LAST_DUE IntegerNullable ['numeric']\n", "DAYS_TERMINATION IntegerNullable ['numeric']\n", "NFLAG_INSURED_ON_APPROVAL IntegerNullable ['numeric']" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "previous_application.ww.schema" ] }, { "cell_type": "code", "execution_count": 30, "id": "c0551cc8", "metadata": {}, "outputs": [], "source": [ "previous_application.ww.set_types(semantic_tags={'SK_ID_CURR':'ignore'})" ] }, { "cell_type": "code", "execution_count": 31, "id": "fbb533d5", "metadata": {}, "outputs": [], "source": [ "previous_application.ww.set_types(\n", " logical_types = {\n", " 'HOUR_APPR_PROCESS_START': 'Categorical',\n", " }\n", ")" ] }, { "cell_type": "code", "execution_count": 32, "id": "1b970b69", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 0], dtype=int64)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "previous_application['NFLAG_LAST_APPL_IN_DAY'].unique()" ] }, { "cell_type": "code", "execution_count": 33, "id": "b7589ff0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "[0, 1, ]\n", "Length: 3, dtype: Int64" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "previous_application['NFLAG_INSURED_ON_APPROVAL'].unique()" ] }, { "cell_type": "code", "execution_count": 34, "id": "814a704a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "673065" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "previous_application['NFLAG_INSURED_ON_APPROVAL'].isnull().sum()" ] }, { "cell_type": "markdown", "id": "47447a1c", "metadata": {}, "source": [ "nan比例过大,我们不应该设置`NFLAG_INSURED_ON_APPROVAL` 为布尔, 而是Categorical" ] }, { "cell_type": "code", "execution_count": 35, "id": "e4c2d639", "metadata": {}, "outputs": [], "source": [ "previous_application.ww.set_types(\n", " logical_types = {\n", " 'NFLAG_LAST_APPL_IN_DAY': 'Boolean',\n", " 'NFLAG_INSURED_ON_APPROVAL': 'Categorical'\n", " }\n", ")" ] }, { "cell_type": "code", "execution_count": 36, "id": "d8874a0b", "metadata": {}, "outputs": [], "source": [ "credit_card_balance = credit_card_balance.reset_index().rename(columns = {'index':'credit_index'})\n", "credit_card_balance.ww.init(name='credit', index = 'credit_index')" ] }, { "cell_type": "code", "execution_count": 37, "id": "1023c60f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Logical TypeSemantic Tag(s)
Column
credit_indexInteger['index']
SK_ID_PREVInteger['numeric']
SK_ID_CURRInteger['numeric']
MONTHS_BALANCEInteger['numeric']
AMT_BALANCEDouble['numeric']
AMT_CREDIT_LIMIT_ACTUALInteger['numeric']
AMT_DRAWINGS_ATM_CURRENTDouble['numeric']
AMT_DRAWINGS_CURRENTDouble['numeric']
AMT_DRAWINGS_OTHER_CURRENTDouble['numeric']
AMT_DRAWINGS_POS_CURRENTDouble['numeric']
AMT_INST_MIN_REGULARITYDouble['numeric']
AMT_PAYMENT_CURRENTDouble['numeric']
AMT_PAYMENT_TOTAL_CURRENTDouble['numeric']
AMT_RECEIVABLE_PRINCIPALDouble['numeric']
AMT_RECIVABLEDouble['numeric']
AMT_TOTAL_RECEIVABLEDouble['numeric']
CNT_DRAWINGS_ATM_CURRENTIntegerNullable['numeric']
CNT_DRAWINGS_CURRENTInteger['numeric']
CNT_DRAWINGS_OTHER_CURRENTIntegerNullable['numeric']
CNT_DRAWINGS_POS_CURRENTIntegerNullable['numeric']
CNT_INSTALMENT_MATURE_CUMIntegerNullable['numeric']
NAME_CONTRACT_STATUSCategorical['category']
SK_DPDInteger['numeric']
SK_DPD_DEFInteger['numeric']
" ], "text/plain": [ " Logical Type Semantic Tag(s)\n", "Column \n", "credit_index Integer ['index']\n", "SK_ID_PREV Integer ['numeric']\n", "SK_ID_CURR Integer ['numeric']\n", "MONTHS_BALANCE Integer ['numeric']\n", "AMT_BALANCE Double ['numeric']\n", "AMT_CREDIT_LIMIT_ACTUAL Integer ['numeric']\n", "AMT_DRAWINGS_ATM_CURRENT Double ['numeric']\n", "AMT_DRAWINGS_CURRENT Double ['numeric']\n", "AMT_DRAWINGS_OTHER_CURRENT Double ['numeric']\n", "AMT_DRAWINGS_POS_CURRENT Double ['numeric']\n", "AMT_INST_MIN_REGULARITY Double ['numeric']\n", "AMT_PAYMENT_CURRENT Double ['numeric']\n", "AMT_PAYMENT_TOTAL_CURRENT Double ['numeric']\n", "AMT_RECEIVABLE_PRINCIPAL Double ['numeric']\n", "AMT_RECIVABLE Double ['numeric']\n", "AMT_TOTAL_RECEIVABLE Double ['numeric']\n", "CNT_DRAWINGS_ATM_CURRENT IntegerNullable ['numeric']\n", "CNT_DRAWINGS_CURRENT Integer ['numeric']\n", "CNT_DRAWINGS_OTHER_CURRENT IntegerNullable ['numeric']\n", "CNT_DRAWINGS_POS_CURRENT IntegerNullable ['numeric']\n", "CNT_INSTALMENT_MATURE_CUM IntegerNullable ['numeric']\n", "NAME_CONTRACT_STATUS Categorical ['category']\n", "SK_DPD Integer ['numeric']\n", "SK_DPD_DEF Integer ['numeric']" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "credit_card_balance.ww.schema" ] }, { "cell_type": "code", "execution_count": 38, "id": "cfc5a247", "metadata": {}, "outputs": [], "source": [ "credit_card_balance.ww.set_types(semantic_tags={'SK_ID_CURR':'ignore', 'SK_ID_PREV':'ignore'})" ] }, { "cell_type": "code", "execution_count": 39, "id": "b6c9849f", "metadata": {}, "outputs": [], "source": [ "installments_payments = installments_payments.reset_index().rename(columns = {'index':'installments_index'})\n", "\n", "installments_payments.ww.init(name = 'installments', index='installments_index')" ] }, { "cell_type": "code", "execution_count": 40, "id": "24f38556", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Logical TypeSemantic Tag(s)
Column
installments_indexInteger['index']
SK_ID_PREVInteger['numeric']
SK_ID_CURRInteger['numeric']
NUM_INSTALMENT_VERSIONDouble['numeric']
NUM_INSTALMENT_NUMBERInteger['numeric']
DAYS_INSTALMENTDouble['numeric']
DAYS_ENTRY_PAYMENTIntegerNullable['numeric']
AMT_INSTALMENTDouble['numeric']
AMT_PAYMENTDouble['numeric']
" ], "text/plain": [ " Logical Type Semantic Tag(s)\n", "Column \n", "installments_index Integer ['index']\n", "SK_ID_PREV Integer ['numeric']\n", "SK_ID_CURR Integer ['numeric']\n", "NUM_INSTALMENT_VERSION Double ['numeric']\n", "NUM_INSTALMENT_NUMBER Integer ['numeric']\n", "DAYS_INSTALMENT Double ['numeric']\n", "DAYS_ENTRY_PAYMENT IntegerNullable ['numeric']\n", "AMT_INSTALMENT Double ['numeric']\n", "AMT_PAYMENT Double ['numeric']" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "installments_payments.ww.schema" ] }, { "cell_type": "code", "execution_count": 41, "id": "1f56c28f", "metadata": {}, "outputs": [], "source": [ "installments_payments.ww.set_types(semantic_tags={'SK_ID_CURR':'ignore', 'SK_ID_PREV':'ignore'})" ] }, { "cell_type": "markdown", "id": "7a974f79", "metadata": {}, "source": [ "`NUM_INSTALMENT_VERSION` 更换类型为整数,这也会影响到后面得特征矩阵" ] }, { "cell_type": "code", "execution_count": 42, "id": "2e5c63be", "metadata": {}, "outputs": [], "source": [ "installments_payments.ww.set_types(\n", " logical_types = {\n", " 'NUM_INSTALMENT_VERSION': 'Integer',\n", " 'DAYS_INSTALMENT': 'Integer'\n", " }\n", ")" ] }, { "cell_type": "code", "execution_count": 43, "id": "09276350", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "installments_payments['DAYS_INSTALMENT'].isnull().sum()" ] }, { "cell_type": "code", "execution_count": 44, "id": "213edce0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "installments_payments['NUM_INSTALMENT_VERSION'].isnull().sum()" ] }, { "cell_type": "code", "execution_count": 45, "id": "67d7711d", "metadata": {}, "outputs": [], "source": [ "pos_cash_balance = pos_cash_balance.reset_index().rename(columns = {'index':'cash_index'})\n", "pos_cash_balance.ww.init(name='cash', index='cash_index')\n" ] }, { "cell_type": "code", "execution_count": 46, "id": "e570fce7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Logical TypeSemantic Tag(s)
Column
cash_indexInteger['index']
SK_ID_PREVInteger['numeric']
SK_ID_CURRInteger['numeric']
MONTHS_BALANCEInteger['numeric']
CNT_INSTALMENTIntegerNullable['numeric']
CNT_INSTALMENT_FUTUREIntegerNullable['numeric']
NAME_CONTRACT_STATUSCategorical['category']
SK_DPDInteger['numeric']
SK_DPD_DEFInteger['numeric']
" ], "text/plain": [ " Logical Type Semantic Tag(s)\n", "Column \n", "cash_index Integer ['index']\n", "SK_ID_PREV Integer ['numeric']\n", "SK_ID_CURR Integer ['numeric']\n", "MONTHS_BALANCE Integer ['numeric']\n", "CNT_INSTALMENT IntegerNullable ['numeric']\n", "CNT_INSTALMENT_FUTURE IntegerNullable ['numeric']\n", "NAME_CONTRACT_STATUS Categorical ['category']\n", "SK_DPD Integer ['numeric']\n", "SK_DPD_DEF Integer ['numeric']" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pos_cash_balance.ww.schema" ] }, { "cell_type": "code", "execution_count": 47, "id": "e090fd93", "metadata": {}, "outputs": [], "source": [ "pos_cash_balance.ww.set_types(semantic_tags={'SK_ID_CURR':'ignore', 'SK_ID_PREV':'ignore'})" ] }, { "cell_type": "markdown", "id": "b920d11c", "metadata": {}, "source": [ "## 构建es" ] }, { "cell_type": "markdown", "id": "9e534c5c", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "13ef33da", "metadata": {}, "source": [ "featuretools对于已经初始化的ww,有些要求:\n", "- 具备index\n", "- name" ] }, { "cell_type": "code", "execution_count": 48, "id": "55a96aab", "metadata": {}, "outputs": [], "source": [ "es = ft.EntitySet(id='clients')\n", "\n", "# 有主键唯一列\n", "es = es.add_dataframe( dataframe=app,)\n", "es = es.add_dataframe( dataframe=bureau)\n", "es = es.add_dataframe( dataframe=previous_application)\n", "\n", "# 没有主键唯一的列,需要make_index, 创建一列主键\n", "es = es.add_dataframe(dataframe=bureau_balance)\n", "es = es.add_dataframe( dataframe=credit_card_balance)\n", "es = es.add_dataframe( dataframe=installments_payments)\n", "es = es.add_dataframe(dataframe=pos_cash_balance)" ] }, { "cell_type": "code", "execution_count": 49, "id": "56ed6406", "metadata": {}, "outputs": [], "source": [ "# 父亲dfname, 父亲列名; 字dfname, 子列名\n", "es = es.add_relationship(\"app\", \"SK_ID_CURR\", \"bureau\", \"SK_ID_CURR\")\n", "es = es.add_relationship(\"bureau\", \"SK_ID_BUREAU\", \"bureau_balance\", \"SK_ID_BUREAU\")\n", "\n", "es = es.add_relationship(\"app\", \"SK_ID_CURR\", \"previous\", \"SK_ID_CURR\")\n", "es = es.add_relationship(\"previous\", \"SK_ID_PREV\", \"cash\", \"SK_ID_PREV\")\n", "es = es.add_relationship(\"previous\", \"SK_ID_PREV\", \"installments\", \"SK_ID_PREV\")\n", "es = es.add_relationship(\"previous\", \"SK_ID_PREV\", \"credit\", \"SK_ID_PREV\")" ] }, { "cell_type": "markdown", "id": "e5406e34", "metadata": {}, "source": [ "在构建完关系后,语义标签上会携带外键" ] }, { "cell_type": "code", "execution_count": 50, "id": "f9eaa11c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Physical TypeLogical TypeSemantic Tag(s)
Column
SK_ID_CURRint64Integer['index']
TARGETInt64IntegerNullable['numeric']
NAME_CONTRACT_TYPEcategoryCategorical['category']
CODE_GENDERcategoryCategorical['category']
FLAG_OWN_CARboolBoolean[]
FLAG_OWN_REALTYboolBoolean[]
CNT_CHILDRENint64Integer['numeric']
AMT_INCOME_TOTALfloat64Double['numeric']
AMT_CREDITfloat64Double['numeric']
AMT_ANNUITYfloat64Double['numeric']
AMT_GOODS_PRICEfloat64Double['numeric']
NAME_TYPE_SUITEcategoryCategorical['category']
NAME_INCOME_TYPEcategoryCategorical['category']
NAME_EDUCATION_TYPEcategoryCategorical['category']
NAME_FAMILY_STATUScategoryCategorical['category']
NAME_HOUSING_TYPEcategoryCategorical['category']
REGION_POPULATION_RELATIVEfloat64Double['numeric']
DAYS_BIRTHint64Integer['numeric']
DAYS_EMPLOYEDint64Integer['numeric']
DAYS_REGISTRATIONfloat64Double['numeric']
DAYS_ID_PUBLISHint64Integer['numeric']
OWN_CAR_AGEInt64IntegerNullable['numeric']
FLAG_MOBILboolBoolean[]
FLAG_EMP_PHONEboolBoolean[]
FLAG_WORK_PHONEboolBoolean[]
FLAG_CONT_MOBILEboolBoolean[]
FLAG_PHONEboolBoolean[]
FLAG_EMAILboolBoolean[]
OCCUPATION_TYPEcategoryCategorical['category']
CNT_FAM_MEMBERSfloat64Double['numeric']
REGION_RATING_CLIENTcategoryOrdinal: [1, 2, 3]['category']
REGION_RATING_CLIENT_W_CITYcategoryOrdinal: [1, 2, 3]['category']
WEEKDAY_APPR_PROCESS_STARTcategoryCategorical['category']
HOUR_APPR_PROCESS_STARTcategoryCategorical['category']
REG_REGION_NOT_LIVE_REGIONint64Integer['numeric']
REG_REGION_NOT_WORK_REGIONint64Integer['numeric']
LIVE_REGION_NOT_WORK_REGIONint64Integer['numeric']
REG_CITY_NOT_LIVE_CITYboolBoolean[]
REG_CITY_NOT_WORK_CITYboolBoolean[]
LIVE_CITY_NOT_WORK_CITYboolBoolean[]
ORGANIZATION_TYPEcategoryCategorical['category']
EXT_SOURCE_1float64Double['numeric']
EXT_SOURCE_2float64Double['numeric']
EXT_SOURCE_3float64Double['numeric']
APARTMENTS_AVGfloat64Double['numeric']
BASEMENTAREA_AVGfloat64Double['numeric']
YEARS_BEGINEXPLUATATION_AVGfloat64Double['numeric']
YEARS_BUILD_AVGfloat64Double['numeric']
COMMONAREA_AVGfloat64Double['numeric']
ELEVATORS_AVGfloat64Double['numeric']
ENTRANCES_AVGfloat64Double['numeric']
FLOORSMAX_AVGfloat64Double['numeric']
FLOORSMIN_AVGfloat64Double['numeric']
LANDAREA_AVGfloat64Double['numeric']
LIVINGAPARTMENTS_AVGfloat64Double['numeric']
LIVINGAREA_AVGfloat64Double['numeric']
NONLIVINGAPARTMENTS_AVGfloat64Double['numeric']
NONLIVINGAREA_AVGfloat64Double['numeric']
APARTMENTS_MODEfloat64Double['numeric']
BASEMENTAREA_MODEfloat64Double['numeric']
YEARS_BEGINEXPLUATATION_MODEfloat64Double['numeric']
YEARS_BUILD_MODEfloat64Double['numeric']
COMMONAREA_MODEfloat64Double['numeric']
ELEVATORS_MODEfloat64Double['numeric']
ENTRANCES_MODEfloat64Double['numeric']
FLOORSMAX_MODEfloat64Double['numeric']
FLOORSMIN_MODEfloat64Double['numeric']
LANDAREA_MODEfloat64Double['numeric']
LIVINGAPARTMENTS_MODEfloat64Double['numeric']
LIVINGAREA_MODEfloat64Double['numeric']
NONLIVINGAPARTMENTS_MODEfloat64Double['numeric']
NONLIVINGAREA_MODEfloat64Double['numeric']
APARTMENTS_MEDIfloat64Double['numeric']
BASEMENTAREA_MEDIfloat64Double['numeric']
YEARS_BEGINEXPLUATATION_MEDIfloat64Double['numeric']
YEARS_BUILD_MEDIfloat64Double['numeric']
COMMONAREA_MEDIfloat64Double['numeric']
ELEVATORS_MEDIfloat64Double['numeric']
ENTRANCES_MEDIfloat64Double['numeric']
FLOORSMAX_MEDIfloat64Double['numeric']
FLOORSMIN_MEDIfloat64Double['numeric']
LANDAREA_MEDIfloat64Double['numeric']
LIVINGAPARTMENTS_MEDIfloat64Double['numeric']
LIVINGAREA_MEDIfloat64Double['numeric']
NONLIVINGAPARTMENTS_MEDIfloat64Double['numeric']
NONLIVINGAREA_MEDIfloat64Double['numeric']
FONDKAPREMONT_MODEcategoryCategorical['category']
HOUSETYPE_MODEcategoryCategorical['category']
TOTALAREA_MODEfloat64Double['numeric']
WALLSMATERIAL_MODEcategoryCategorical['category']
EMERGENCYSTATE_MODEbooleanBooleanNullable[]
OBS_30_CNT_SOCIAL_CIRCLEInt64IntegerNullable['numeric']
DEF_30_CNT_SOCIAL_CIRCLEInt64IntegerNullable['numeric']
OBS_60_CNT_SOCIAL_CIRCLEInt64IntegerNullable['numeric']
DEF_60_CNT_SOCIAL_CIRCLEInt64IntegerNullable['numeric']
DAYS_LAST_PHONE_CHANGEInt64IntegerNullable['numeric']
FLAG_DOCUMENT_2boolBoolean[]
FLAG_DOCUMENT_3boolBoolean[]
FLAG_DOCUMENT_4boolBoolean[]
FLAG_DOCUMENT_5boolBoolean[]
FLAG_DOCUMENT_6boolBoolean[]
FLAG_DOCUMENT_7boolBoolean[]
FLAG_DOCUMENT_8boolBoolean[]
FLAG_DOCUMENT_9boolBoolean[]
FLAG_DOCUMENT_10boolBoolean[]
FLAG_DOCUMENT_11boolBoolean[]
FLAG_DOCUMENT_12boolBoolean[]
FLAG_DOCUMENT_13boolBoolean[]
FLAG_DOCUMENT_14boolBoolean[]
FLAG_DOCUMENT_15boolBoolean[]
FLAG_DOCUMENT_16boolBoolean[]
FLAG_DOCUMENT_17boolBoolean[]
FLAG_DOCUMENT_18boolBoolean[]
FLAG_DOCUMENT_19boolBoolean[]
FLAG_DOCUMENT_20boolBoolean[]
FLAG_DOCUMENT_21boolBoolean[]
AMT_REQ_CREDIT_BUREAU_HOURInt64IntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_DAYInt64IntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_WEEKInt64IntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_MONInt64IntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_QRTInt64IntegerNullable['numeric']
AMT_REQ_CREDIT_BUREAU_YEARInt64IntegerNullable['numeric']
" ], "text/plain": [ " Physical Type Logical Type Semantic Tag(s)\n", "Column \n", "SK_ID_CURR int64 Integer ['index']\n", "TARGET Int64 IntegerNullable ['numeric']\n", "NAME_CONTRACT_TYPE category Categorical ['category']\n", "CODE_GENDER category Categorical ['category']\n", "FLAG_OWN_CAR bool Boolean []\n", "... ... ... ...\n", "AMT_REQ_CREDIT_BUREAU_DAY Int64 IntegerNullable ['numeric']\n", "AMT_REQ_CREDIT_BUREAU_WEEK Int64 IntegerNullable ['numeric']\n", "AMT_REQ_CREDIT_BUREAU_MON Int64 IntegerNullable ['numeric']\n", "AMT_REQ_CREDIT_BUREAU_QRT Int64 IntegerNullable ['numeric']\n", "AMT_REQ_CREDIT_BUREAU_YEAR Int64 IntegerNullable ['numeric']\n", "\n", "[122 rows x 3 columns]" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['app'].ww" ] }, { "cell_type": "code", "execution_count": 51, "id": "b1d27ddf", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Physical TypeLogical TypeSemantic Tag(s)
Column
SK_ID_CURRint64Integer['foreign_key', 'numeric', 'ignore']
SK_ID_BUREAUint64Integer['index']
CREDIT_ACTIVEcategoryCategorical['category']
CREDIT_CURRENCYcategoryCategorical['category']
DAYS_CREDITint64Integer['numeric']
CREDIT_DAY_OVERDUEint64Integer['numeric']
DAYS_CREDIT_ENDDATEInt64IntegerNullable['numeric']
DAYS_ENDDATE_FACTInt64IntegerNullable['numeric']
AMT_CREDIT_MAX_OVERDUEfloat64Double['numeric']
CNT_CREDIT_PROLONGint64Integer['numeric']
AMT_CREDIT_SUMfloat64Double['numeric']
AMT_CREDIT_SUM_DEBTfloat64Double['numeric']
AMT_CREDIT_SUM_LIMITfloat64Double['numeric']
AMT_CREDIT_SUM_OVERDUEfloat64Double['numeric']
CREDIT_TYPEcategoryCategorical['category']
DAYS_CREDIT_UPDATEint64Integer['numeric']
AMT_ANNUITYfloat64Double['numeric']
" ], "text/plain": [ " Physical Type Logical Type \\\n", "Column \n", "SK_ID_CURR int64 Integer \n", "SK_ID_BUREAU int64 Integer \n", "CREDIT_ACTIVE category Categorical \n", "CREDIT_CURRENCY category Categorical \n", "DAYS_CREDIT int64 Integer \n", "CREDIT_DAY_OVERDUE int64 Integer \n", "DAYS_CREDIT_ENDDATE Int64 IntegerNullable \n", "DAYS_ENDDATE_FACT Int64 IntegerNullable \n", "AMT_CREDIT_MAX_OVERDUE float64 Double \n", "CNT_CREDIT_PROLONG int64 Integer \n", "AMT_CREDIT_SUM float64 Double \n", "AMT_CREDIT_SUM_DEBT float64 Double \n", "AMT_CREDIT_SUM_LIMIT float64 Double \n", "AMT_CREDIT_SUM_OVERDUE float64 Double \n", "CREDIT_TYPE category Categorical \n", "DAYS_CREDIT_UPDATE int64 Integer \n", "AMT_ANNUITY float64 Double \n", "\n", " Semantic Tag(s) \n", "Column \n", "SK_ID_CURR ['foreign_key', 'numeric', 'ignore'] \n", "SK_ID_BUREAU ['index'] \n", "CREDIT_ACTIVE ['category'] \n", "CREDIT_CURRENCY ['category'] \n", "DAYS_CREDIT ['numeric'] \n", "CREDIT_DAY_OVERDUE ['numeric'] \n", "DAYS_CREDIT_ENDDATE ['numeric'] \n", "DAYS_ENDDATE_FACT ['numeric'] \n", "AMT_CREDIT_MAX_OVERDUE ['numeric'] \n", "CNT_CREDIT_PROLONG ['numeric'] \n", "AMT_CREDIT_SUM ['numeric'] \n", "AMT_CREDIT_SUM_DEBT ['numeric'] \n", "AMT_CREDIT_SUM_LIMIT ['numeric'] \n", "AMT_CREDIT_SUM_OVERDUE ['numeric'] \n", "CREDIT_TYPE ['category'] \n", "DAYS_CREDIT_UPDATE ['numeric'] \n", "AMT_ANNUITY ['numeric'] " ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['bureau'].ww" ] }, { "cell_type": "code", "execution_count": 52, "id": "6bc3914e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Physical TypeLogical TypeSemantic Tag(s)
Column
bureaubalance_indexint64Integer['index']
SK_ID_BUREAUint64Integer['foreign_key', 'numeric', 'ignore']
MONTHS_BALANCEint64Integer['numeric']
STATUScategoryCategorical['category']
" ], "text/plain": [ " Physical Type Logical Type \\\n", "Column \n", "bureaubalance_index int64 Integer \n", "SK_ID_BUREAU int64 Integer \n", "MONTHS_BALANCE int64 Integer \n", "STATUS category Categorical \n", "\n", " Semantic Tag(s) \n", "Column \n", "bureaubalance_index ['index'] \n", "SK_ID_BUREAU ['foreign_key', 'numeric', 'ignore'] \n", "MONTHS_BALANCE ['numeric'] \n", "STATUS ['category'] " ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['bureau_balance'].ww" ] }, { "cell_type": "code", "execution_count": 53, "id": "f90363d3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Physical TypeLogical TypeSemantic Tag(s)
Column
SK_ID_PREVint64Integer['index']
SK_ID_CURRint64Integer['foreign_key', 'numeric', 'ignore']
NAME_CONTRACT_TYPEcategoryCategorical['category']
AMT_ANNUITYfloat64Double['numeric']
AMT_APPLICATIONfloat64Double['numeric']
AMT_CREDITfloat64Double['numeric']
AMT_DOWN_PAYMENTfloat64Double['numeric']
AMT_GOODS_PRICEfloat64Double['numeric']
WEEKDAY_APPR_PROCESS_STARTcategoryCategorical['category']
HOUR_APPR_PROCESS_STARTcategoryCategorical['category']
FLAG_LAST_APPL_PER_CONTRACTboolBoolean[]
NFLAG_LAST_APPL_IN_DAYboolBoolean[]
RATE_DOWN_PAYMENTfloat64Double['numeric']
RATE_INTEREST_PRIMARYfloat64Double['numeric']
RATE_INTEREST_PRIVILEGEDfloat64Double['numeric']
NAME_CASH_LOAN_PURPOSEcategoryCategorical['category']
NAME_CONTRACT_STATUScategoryCategorical['category']
DAYS_DECISIONint64Integer['numeric']
NAME_PAYMENT_TYPEcategoryCategorical['category']
CODE_REJECT_REASONcategoryCategorical['category']
NAME_TYPE_SUITEcategoryCategorical['category']
NAME_CLIENT_TYPEcategoryCategorical['category']
NAME_GOODS_CATEGORYcategoryCategorical['category']
NAME_PORTFOLIOcategoryCategorical['category']
NAME_PRODUCT_TYPEcategoryCategorical['category']
CHANNEL_TYPEcategoryCategorical['category']
SELLERPLACE_AREAint64Integer['numeric']
NAME_SELLER_INDUSTRYcategoryCategorical['category']
CNT_PAYMENTInt64IntegerNullable['numeric']
NAME_YIELD_GROUPcategoryCategorical['category']
PRODUCT_COMBINATIONcategoryCategorical['category']
DAYS_FIRST_DRAWINGInt64IntegerNullable['numeric']
DAYS_FIRST_DUEInt64IntegerNullable['numeric']
DAYS_LAST_DUE_1ST_VERSIONInt64IntegerNullable['numeric']
DAYS_LAST_DUEInt64IntegerNullable['numeric']
DAYS_TERMINATIONInt64IntegerNullable['numeric']
NFLAG_INSURED_ON_APPROVALcategoryCategorical['category']
" ], "text/plain": [ " Physical Type Logical Type \\\n", "Column \n", "SK_ID_PREV int64 Integer \n", "SK_ID_CURR int64 Integer \n", "NAME_CONTRACT_TYPE category Categorical \n", "AMT_ANNUITY float64 Double \n", "AMT_APPLICATION float64 Double \n", "AMT_CREDIT float64 Double \n", "AMT_DOWN_PAYMENT float64 Double \n", "AMT_GOODS_PRICE float64 Double \n", "WEEKDAY_APPR_PROCESS_START category Categorical \n", "HOUR_APPR_PROCESS_START category Categorical \n", "FLAG_LAST_APPL_PER_CONTRACT bool Boolean \n", "NFLAG_LAST_APPL_IN_DAY bool Boolean \n", "RATE_DOWN_PAYMENT float64 Double \n", "RATE_INTEREST_PRIMARY float64 Double \n", "RATE_INTEREST_PRIVILEGED float64 Double \n", "NAME_CASH_LOAN_PURPOSE category Categorical \n", "NAME_CONTRACT_STATUS category Categorical \n", "DAYS_DECISION int64 Integer \n", "NAME_PAYMENT_TYPE category Categorical \n", "CODE_REJECT_REASON category Categorical \n", "NAME_TYPE_SUITE category Categorical \n", "NAME_CLIENT_TYPE category Categorical \n", "NAME_GOODS_CATEGORY category Categorical \n", "NAME_PORTFOLIO category Categorical \n", "NAME_PRODUCT_TYPE category Categorical \n", "CHANNEL_TYPE category Categorical \n", "SELLERPLACE_AREA int64 Integer \n", "NAME_SELLER_INDUSTRY category Categorical \n", "CNT_PAYMENT Int64 IntegerNullable \n", "NAME_YIELD_GROUP category Categorical \n", "PRODUCT_COMBINATION category Categorical \n", "DAYS_FIRST_DRAWING Int64 IntegerNullable \n", "DAYS_FIRST_DUE Int64 IntegerNullable \n", "DAYS_LAST_DUE_1ST_VERSION Int64 IntegerNullable \n", "DAYS_LAST_DUE Int64 IntegerNullable \n", "DAYS_TERMINATION Int64 IntegerNullable \n", "NFLAG_INSURED_ON_APPROVAL category Categorical \n", "\n", " Semantic Tag(s) \n", "Column \n", "SK_ID_PREV ['index'] \n", "SK_ID_CURR ['foreign_key', 'numeric', 'ignore'] \n", "NAME_CONTRACT_TYPE ['category'] \n", "AMT_ANNUITY ['numeric'] \n", "AMT_APPLICATION ['numeric'] \n", "AMT_CREDIT ['numeric'] \n", "AMT_DOWN_PAYMENT ['numeric'] \n", "AMT_GOODS_PRICE ['numeric'] \n", "WEEKDAY_APPR_PROCESS_START ['category'] \n", "HOUR_APPR_PROCESS_START ['category'] \n", "FLAG_LAST_APPL_PER_CONTRACT [] \n", "NFLAG_LAST_APPL_IN_DAY [] \n", "RATE_DOWN_PAYMENT ['numeric'] \n", "RATE_INTEREST_PRIMARY ['numeric'] \n", "RATE_INTEREST_PRIVILEGED ['numeric'] \n", "NAME_CASH_LOAN_PURPOSE ['category'] \n", "NAME_CONTRACT_STATUS ['category'] \n", "DAYS_DECISION ['numeric'] \n", "NAME_PAYMENT_TYPE ['category'] \n", "CODE_REJECT_REASON ['category'] \n", "NAME_TYPE_SUITE ['category'] \n", "NAME_CLIENT_TYPE ['category'] \n", "NAME_GOODS_CATEGORY ['category'] \n", "NAME_PORTFOLIO ['category'] \n", "NAME_PRODUCT_TYPE ['category'] \n", "CHANNEL_TYPE ['category'] \n", "SELLERPLACE_AREA ['numeric'] \n", "NAME_SELLER_INDUSTRY ['category'] \n", "CNT_PAYMENT ['numeric'] \n", "NAME_YIELD_GROUP ['category'] \n", "PRODUCT_COMBINATION ['category'] \n", "DAYS_FIRST_DRAWING ['numeric'] \n", "DAYS_FIRST_DUE ['numeric'] \n", "DAYS_LAST_DUE_1ST_VERSION ['numeric'] \n", "DAYS_LAST_DUE ['numeric'] \n", "DAYS_TERMINATION ['numeric'] \n", "NFLAG_INSURED_ON_APPROVAL ['category'] " ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['previous'].ww" ] }, { "cell_type": "code", "execution_count": 54, "id": "c01741f9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Physical TypeLogical TypeSemantic Tag(s)
Column
cash_indexint64Integer['index']
SK_ID_PREVint64Integer['foreign_key', 'numeric', 'ignore']
SK_ID_CURRint64Integer['numeric', 'ignore']
MONTHS_BALANCEint64Integer['numeric']
CNT_INSTALMENTInt64IntegerNullable['numeric']
CNT_INSTALMENT_FUTUREInt64IntegerNullable['numeric']
NAME_CONTRACT_STATUScategoryCategorical['category']
SK_DPDint64Integer['numeric']
SK_DPD_DEFint64Integer['numeric']
" ], "text/plain": [ " Physical Type Logical Type \\\n", "Column \n", "cash_index int64 Integer \n", "SK_ID_PREV int64 Integer \n", "SK_ID_CURR int64 Integer \n", "MONTHS_BALANCE int64 Integer \n", "CNT_INSTALMENT Int64 IntegerNullable \n", "CNT_INSTALMENT_FUTURE Int64 IntegerNullable \n", "NAME_CONTRACT_STATUS category Categorical \n", "SK_DPD int64 Integer \n", "SK_DPD_DEF int64 Integer \n", "\n", " Semantic Tag(s) \n", "Column \n", "cash_index ['index'] \n", "SK_ID_PREV ['foreign_key', 'numeric', 'ignore'] \n", "SK_ID_CURR ['numeric', 'ignore'] \n", "MONTHS_BALANCE ['numeric'] \n", "CNT_INSTALMENT ['numeric'] \n", "CNT_INSTALMENT_FUTURE ['numeric'] \n", "NAME_CONTRACT_STATUS ['category'] \n", "SK_DPD ['numeric'] \n", "SK_DPD_DEF ['numeric'] " ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['cash'].ww" ] }, { "cell_type": "code", "execution_count": 55, "id": "d1bdec13", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Physical TypeLogical TypeSemantic Tag(s)
Column
credit_indexint64Integer['index']
SK_ID_PREVint64Integer['foreign_key', 'numeric', 'ignore']
SK_ID_CURRint64Integer['numeric', 'ignore']
MONTHS_BALANCEint64Integer['numeric']
AMT_BALANCEfloat64Double['numeric']
AMT_CREDIT_LIMIT_ACTUALint64Integer['numeric']
AMT_DRAWINGS_ATM_CURRENTfloat64Double['numeric']
AMT_DRAWINGS_CURRENTfloat64Double['numeric']
AMT_DRAWINGS_OTHER_CURRENTfloat64Double['numeric']
AMT_DRAWINGS_POS_CURRENTfloat64Double['numeric']
AMT_INST_MIN_REGULARITYfloat64Double['numeric']
AMT_PAYMENT_CURRENTfloat64Double['numeric']
AMT_PAYMENT_TOTAL_CURRENTfloat64Double['numeric']
AMT_RECEIVABLE_PRINCIPALfloat64Double['numeric']
AMT_RECIVABLEfloat64Double['numeric']
AMT_TOTAL_RECEIVABLEfloat64Double['numeric']
CNT_DRAWINGS_ATM_CURRENTInt64IntegerNullable['numeric']
CNT_DRAWINGS_CURRENTint64Integer['numeric']
CNT_DRAWINGS_OTHER_CURRENTInt64IntegerNullable['numeric']
CNT_DRAWINGS_POS_CURRENTInt64IntegerNullable['numeric']
CNT_INSTALMENT_MATURE_CUMInt64IntegerNullable['numeric']
NAME_CONTRACT_STATUScategoryCategorical['category']
SK_DPDint64Integer['numeric']
SK_DPD_DEFint64Integer['numeric']
" ], "text/plain": [ " Physical Type Logical Type \\\n", "Column \n", "credit_index int64 Integer \n", "SK_ID_PREV int64 Integer \n", "SK_ID_CURR int64 Integer \n", "MONTHS_BALANCE int64 Integer \n", "AMT_BALANCE float64 Double \n", "AMT_CREDIT_LIMIT_ACTUAL int64 Integer \n", "AMT_DRAWINGS_ATM_CURRENT float64 Double \n", "AMT_DRAWINGS_CURRENT float64 Double \n", "AMT_DRAWINGS_OTHER_CURRENT float64 Double \n", "AMT_DRAWINGS_POS_CURRENT float64 Double \n", "AMT_INST_MIN_REGULARITY float64 Double \n", "AMT_PAYMENT_CURRENT float64 Double \n", "AMT_PAYMENT_TOTAL_CURRENT float64 Double \n", "AMT_RECEIVABLE_PRINCIPAL float64 Double \n", "AMT_RECIVABLE float64 Double \n", "AMT_TOTAL_RECEIVABLE float64 Double \n", "CNT_DRAWINGS_ATM_CURRENT Int64 IntegerNullable \n", "CNT_DRAWINGS_CURRENT int64 Integer \n", "CNT_DRAWINGS_OTHER_CURRENT Int64 IntegerNullable \n", "CNT_DRAWINGS_POS_CURRENT Int64 IntegerNullable \n", "CNT_INSTALMENT_MATURE_CUM Int64 IntegerNullable \n", "NAME_CONTRACT_STATUS category Categorical \n", "SK_DPD int64 Integer \n", "SK_DPD_DEF int64 Integer \n", "\n", " Semantic Tag(s) \n", "Column \n", "credit_index ['index'] \n", "SK_ID_PREV ['foreign_key', 'numeric', 'ignore'] \n", "SK_ID_CURR ['numeric', 'ignore'] \n", "MONTHS_BALANCE ['numeric'] \n", "AMT_BALANCE ['numeric'] \n", "AMT_CREDIT_LIMIT_ACTUAL ['numeric'] \n", "AMT_DRAWINGS_ATM_CURRENT ['numeric'] \n", "AMT_DRAWINGS_CURRENT ['numeric'] \n", "AMT_DRAWINGS_OTHER_CURRENT ['numeric'] \n", "AMT_DRAWINGS_POS_CURRENT ['numeric'] \n", "AMT_INST_MIN_REGULARITY ['numeric'] \n", "AMT_PAYMENT_CURRENT ['numeric'] \n", "AMT_PAYMENT_TOTAL_CURRENT ['numeric'] \n", "AMT_RECEIVABLE_PRINCIPAL ['numeric'] \n", "AMT_RECIVABLE ['numeric'] \n", "AMT_TOTAL_RECEIVABLE ['numeric'] \n", "CNT_DRAWINGS_ATM_CURRENT ['numeric'] \n", "CNT_DRAWINGS_CURRENT ['numeric'] \n", "CNT_DRAWINGS_OTHER_CURRENT ['numeric'] \n", "CNT_DRAWINGS_POS_CURRENT ['numeric'] \n", "CNT_INSTALMENT_MATURE_CUM ['numeric'] \n", "NAME_CONTRACT_STATUS ['category'] \n", "SK_DPD ['numeric'] \n", "SK_DPD_DEF ['numeric'] " ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['credit'].ww" ] }, { "cell_type": "code", "execution_count": 56, "id": "351f406f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Physical TypeLogical TypeSemantic Tag(s)
Column
installments_indexint64Integer['index']
SK_ID_PREVint64Integer['foreign_key', 'numeric', 'ignore']
SK_ID_CURRint64Integer['numeric', 'ignore']
NUM_INSTALMENT_VERSIONint64Integer['numeric']
NUM_INSTALMENT_NUMBERint64Integer['numeric']
DAYS_INSTALMENTint64Integer['numeric']
DAYS_ENTRY_PAYMENTInt64IntegerNullable['numeric']
AMT_INSTALMENTfloat64Double['numeric']
AMT_PAYMENTfloat64Double['numeric']
" ], "text/plain": [ " Physical Type Logical Type \\\n", "Column \n", "installments_index int64 Integer \n", "SK_ID_PREV int64 Integer \n", "SK_ID_CURR int64 Integer \n", "NUM_INSTALMENT_VERSION int64 Integer \n", "NUM_INSTALMENT_NUMBER int64 Integer \n", "DAYS_INSTALMENT int64 Integer \n", "DAYS_ENTRY_PAYMENT Int64 IntegerNullable \n", "AMT_INSTALMENT float64 Double \n", "AMT_PAYMENT float64 Double \n", "\n", " Semantic Tag(s) \n", "Column \n", "installments_index ['index'] \n", "SK_ID_PREV ['foreign_key', 'numeric', 'ignore'] \n", "SK_ID_CURR ['numeric', 'ignore'] \n", "NUM_INSTALMENT_VERSION ['numeric'] \n", "NUM_INSTALMENT_NUMBER ['numeric'] \n", "DAYS_INSTALMENT ['numeric'] \n", "DAYS_ENTRY_PAYMENT ['numeric'] \n", "AMT_INSTALMENT ['numeric'] \n", "AMT_PAYMENT ['numeric'] " ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['installments'].ww" ] }, { "cell_type": "markdown", "id": "cb41357c", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "b7d266b6", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "3604641e", "metadata": {}, "source": [ "## 添加interesting values\n", "就是where = 条件聚合。\n", "\n", "比如设置agg原语`mean`, 产生`MEAN(prev.AMT_CREDIT)`\n", "\n", "如果另外设置where原语`count` 和 兴趣 `{\"NAME_CONTRACT_STATUS\": [\"Approved\", \"Refused\"]}` \n", "就会多两个特征\n", "- `COUNT(prev.AMT_CREDIT where NAME_CONTRACT_STATUS==Approved) `\n", "- `COUNT(prev.AMT_CREDIT where NAME_CONTRACT_STATUS==Refused) `\n" ] }, { "cell_type": "code", "execution_count": 57, "id": "a8298367", "metadata": {}, "outputs": [], "source": [ "es.add_interesting_values(dataframe_name='previous', values= {\n", " \"NAME_CONTRACT_STATUS\": [\"Approved\", \"Refused\"]\n", "})" ] }, { "cell_type": "code", "execution_count": 58, "id": "e8ab2918", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'dataframe_name': 'previous',\n", " 'entityset_id': 'clients',\n", " 'interesting_values': ['Approved', 'Refused']}" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['previous'].ww.columns['NAME_CONTRACT_STATUS'].metadata" ] }, { "cell_type": "markdown", "id": "fbe005fe", "metadata": {}, "source": [ "我们确实为这个列添加了where值" ] }, { "cell_type": "markdown", "id": "3039e7b7", "metadata": {}, "source": [ "## seed feature\n", "没什么特别,就是构造了一列" ] }, { "cell_type": "code", "execution_count": 59, "id": "d1dbe1db", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "196114.0212179794" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "previous_application['AMT_CREDIT'].mean()" ] }, { "cell_type": "code", "execution_count": 60, "id": "3fc6ea37", "metadata": {}, "outputs": [], "source": [ "FLAG_LATED = ft.Feature(es['installments'].ww['DAYS_ENTRY_PAYMENT']) > ft.Feature(es['installments'].ww['DAYS_INSTALMENT'])" ] }, { "cell_type": "code", "execution_count": 61, "id": "20c014e4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ " DAYS_INSTALMENT>" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "FLAG_LATED" ] }, { "cell_type": "markdown", "id": "84350b20", "metadata": {}, "source": [ "FLAG_LATED标识了一种条件" ] }, { "cell_type": "code", "execution_count": 62, "id": "e81429c5", "metadata": {}, "outputs": [], "source": [ "# \n", "FLAG_DUE = ft.Feature(es['bureau_balance'].ww['STATUS']).isin(['1', '2', '3', '4', '5'])" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "FLAG_DUE" ] }, { "cell_type": "code", "execution_count": 64, "id": "a50977dc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Boolean\n" ] } ], "source": [ "print(FLAG_DUE.column_schema.logical_type)" ] }, { "cell_type": "markdown", "id": "7257fdc5", "metadata": {}, "source": [ "## 自定义特征原语\n", "对于自定义原语,我们一定要小心其性能" ] }, { "cell_type": "code", "execution_count": 65, "id": "8c5daf19", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1670214" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es['previous'].ww['NAME_CONTRACT_STATUS'].value_counts().sum()" ] }, { "cell_type": "code", "execution_count": 66, "id": "b96231f8", "metadata": {}, "outputs": [], "source": [ "class NormalizedModeCount(AggregationPrimitive):\n", " \"\"\" 计算出现最多的次数占比总数的比例。\n", " \"\"\"\n", " name = 'normalized_mode_count'\n", " input_types = [ColumnSchema(semantic_tags={'category'})]\n", " return_type = ColumnSchema(semantic_tags={\"numeric\"})\n", "\n", " def get_function(self):\n", " def normalized_mode_count(column):\n", " if len(column) == 0:\n", " return 0\n", " counts = column.value_counts()\n", " if len(counts) == 0:\n", " return 0\n", " return counts.max()/counts.sum()\n", " return normalized_mode_count" ] }, { "cell_type": "markdown", "id": "b5a78e5c", "metadata": {}, "source": [ "比如对于NAME_CONTRACT_STATUS, 表明以往 申请 通过或者拒绝的比例" ] }, { "cell_type": "code", "execution_count": 67, "id": "e6313578", "metadata": {}, "outputs": [], "source": [ "class MaxConsecutive(AggregationPrimitive):\n", " \"\"\" 最大连续次数,一般针对bool\n", " \"\"\"\n", " name = 'max_consecutive'\n", " input_types = [ColumnSchema(logical_type=Boolean)]\n", " return_type = ColumnSchema(semantic_tags={\"numeric\"})\n", " def get_function(self):\n", " def max_consecutive(column):\n", " v = column.values\n", " if len(v) == 0: return 0\n", " \n", " # 在首尾补 0 方便计算切换点\n", " calls = np.concatenate(([0], v, [0]))\n", " # 寻找从 0 变 1 和从 1 变 0 的位置\n", " diffs = np.diff(calls.astype(int))\n", " starts = np.where(diffs == 1)[0]\n", " ends = np.where(diffs == -1)[0]\n", " \n", " if len(starts) == 0: return 0\n", " # 长度即为 结束索引 - 开始索引\n", " return np.max(ends - starts)\n", " return max_consecutive" ] }, { "cell_type": "code", "execution_count": null, "id": "6ea42ef9", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "15e8303d", "metadata": {}, "source": [ "```{warning} \n", "我们必须清晰,哪些原语作用哪些列!" ] }, { "cell_type": "code", "execution_count": null, "id": "af7a6aab", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "c5ab6260", "metadata": {}, "source": [ "## dfs" ] }, { "cell_type": "markdown", "id": "097d9aac", "metadata": {}, "source": [ "特征数估计:\n", "主表100列,从表50列,兴趣特征1*3个分类值, 原语5个。 \n", "50* 5 * 3 + 100" ] }, { "cell_type": "markdown", "id": "65bb4416", "metadata": {}, "source": [ "\n", "外键和索引不需要管" ] }, { "cell_type": "code", "execution_count": 71, "id": "36f8f51d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 4h 41min 18s\n", "Wall time: 5h 46min 14s\n" ] } ], "source": [ "%%time\n", "default_agg_primitives = [\n", " \"count\", # index\n", " \"mean\", \"max\", \"sum\", \"std\", # numeric\n", " \"mode\", \"num_unique\", # categorical\n", " 'percent_true' # boolean\n", " ]\n", "default_trans_primitives = [\"month\", \"weekday\"]\n", "\n", "# 返回特征矩阵; 特征\n", "feature_matrix, features = ft.dfs(\n", " entityset = es,\n", " target_dataframe_name = 'app', # 最后要关联到这个表,以这个为主\n", " agg_primitives= default_agg_primitives + [NormalizedModeCount, MaxConsecutive],\n", " trans_primitives=default_trans_primitives,\n", " max_depth=2,\n", " seed_features=[FLAG_LATED, FLAG_DUE],\n", " # n_jobs=2, # 使用2个核\n", " where_primitives=['count', 'mean', 'percent_true'],\n", ")" ] }, { "cell_type": "code", "execution_count": 72, "id": "a5195ba6", "metadata": {}, "outputs": [], "source": [ "feature_matrix.to_parquet(\"ft_tuning_feature_matrix.parquet\")\n", "ft.save_features(features, \"ft_tuning_feature_definitions.json\")" ] }, { "cell_type": "markdown", "id": "4f2dedd8", "metadata": {}, "source": [ "耗时1h30min" ] }, { "cell_type": "markdown", "id": "76bd0b8e", "metadata": {}, "source": [ "我们需要检查我们的特征确实生效了" ] }, { "cell_type": "code", "execution_count": 73, "id": "4332fa95", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[f for f in features if f.primitive.name == 'normalized_mode_count']" ] }, { "cell_type": "code", "execution_count": 74, "id": "b7ddcf88", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[f for f in features if f.primitive.name == 'max_consecutive']" ] }, { "cell_type": "code", "execution_count": 75, "id": "0b2e966f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[ DAYS_INSTALMENT)>,\n", " DAYS_INSTALMENT))>,\n", " DAYS_INSTALMENT))>,\n", " DAYS_INSTALMENT) WHERE NAME_CONTRACT_STATUS = Approved)>,\n", " DAYS_INSTALMENT) WHERE NAME_CONTRACT_STATUS = Refused)>,\n", " DAYS_INSTALMENT))>,\n", " DAYS_INSTALMENT))>,\n", " DAYS_INSTALMENT WHERE previous.NAME_CONTRACT_STATUS = Refused)>,\n", " DAYS_INSTALMENT WHERE previous.NAME_CONTRACT_STATUS = Approved)>]" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[f for f in features if '>' in f.get_name()]" ] }, { "cell_type": "code", "execution_count": 76, "id": "252c5ae1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[f for f in features if 'isin' in f.get_name()]" ] }, { "cell_type": "markdown", "id": "6c0b8e1e", "metadata": {}, "source": [ "特征按照我们预想的添加了。" ] }, { "cell_type": "markdown", "id": "1e8070b6", "metadata": {}, "source": [ "## modeling\n", "- lgbm不需要one-hot" ] }, { "cell_type": "code", "execution_count": 77, "id": "89e34909", "metadata": {}, "outputs": [], "source": [ "feature_matrix = pd.read_parquet(\"ft_tuning_feature_matrix.parquet\")" ] }, { "cell_type": "code", "execution_count": 78, "id": "44c6005c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(356255, 1891)" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "feature_matrix.shape" ] }, { "cell_type": "code", "execution_count": 79, "id": "bdec30fc", "metadata": {}, "outputs": [], "source": [ "final_fm = feature_matrix.reset_index()" ] }, { "cell_type": "code", "execution_count": 80, "id": "f9a7612b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1\n", "1 0\n", "2 0\n", "3 0\n", "4 0\n", " ... \n", "356250 \n", "356251 \n", "356252 \n", "356253 \n", "356254 \n", "Name: TARGET, Length: 356255, dtype: Int64" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_fm['TARGET']" ] }, { "cell_type": "code", "execution_count": 81, "id": "b06ac067", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(307511, 1892) (48744, 1891)\n" ] } ], "source": [ "final_fm = pd.merge(final_fm, app_set, on='SK_ID_CURR', how='left')\n", "\n", "train = final_fm[final_fm['set'] == 'train']\n", "test = final_fm[final_fm['set'] == 'test']\n", "\n", "train, test = train.align(test, join = 'inner', axis = 1)\n", "train = train.drop(columns=['set'])\n", "test = test.drop(columns = ['TARGET', 'set'])\n", "print(train.shape, test.shape)" ] }, { "cell_type": "code", "execution_count": 82, "id": "44141c3f", "metadata": {}, "outputs": [], "source": [ "train_labels = train['TARGET']\n", "train_ids = train['SK_ID_CURR']\n", "test_ids = test['SK_ID_CURR']\n", "train_features = train.drop(columns=['TARGET', 'SK_ID_CURR'])\n", "test_features = test.drop(columns=['SK_ID_CURR'])" ] }, { "cell_type": "code", "execution_count": 83, "id": "9b1cd6d8", "metadata": {}, "outputs": [], "source": [ "import re\n", "# 1. 定义清理函数\n", "def clean_names(df):\n", " # 替换所有非字母、数字的字符为下划线\n", " # 这里的正则 [^A-Za-z0-9_] 会匹配空格、斜杠、括号等所有特殊字符\n", " df.columns = [re.sub(r'[^A-Za-z0-9_]+', '_', col) for col in df.columns]\n", " # 顺便处理一下可能出现的重复下划线,比如 __\n", " df.columns = [re.sub(r'_+', '_', col).strip('_') for col in df.columns]\n", " return df\n", " " ] }, { "cell_type": "code", "execution_count": 84, "id": "408c3601", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[LightGBM] [Info] Number of positive: 24825, number of negative: 282686\n", "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 2.594608 seconds.\n", "You can set `force_col_wise=true` to remove the overhead.\n", "[LightGBM] [Info] Total Bins 293128\n", "[LightGBM] [Info] Number of data points in the train set: 307511, number of used features: 1666\n", "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.080729 -> initscore=-2.432486\n", "[LightGBM] [Info] Start training from score -2.432486\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n", "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n" ] }, { "data": { "text/html": [ "
LGBMClassifier(max_depth=3, n_jobs=-1, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LGBMClassifier(max_depth=3, n_jobs=-1, random_state=42)" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_features = clean_names(train_features)\n", "test_features = clean_names(test_features)\n", "\n", "from lightgbm import LGBMClassifier\n", "lgbm_model = LGBMClassifier(\n", " n_estimators=100, # 对应 max_iter,树的个数\n", " learning_rate=0.1, # 学习率\n", " max_depth=3, # 树的最大深度\n", " random_state=42, # 保证结果可复现\n", ")\n", "lgbm_model.fit(train_features, train_labels)\n" ] }, { "cell_type": "code", "execution_count": 85, "id": "2beb8ba2", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAJOCAYAAAAqFJGJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAADOt0lEQVR4nOzdeXxN1/7/8ddJ0sSYpKaihtAkkshwEkFLRZAW9yqNJlSpUq6ahxYVdYuWmofSqpZbQ68hEWIoqviiKmiREIK2OIamtILEVFPO7w+/7OtIIolQxfv5eOzHvVl77bU+e5/jdH/OWmsfk9VqtSIiIiIiIlIAdg86ABERERERefgpsRARERERkQJTYiEiIiIiIgWmxEJERERERApMiYWIiIiIiBSYEgsRERERESkwJRYiIiIiIlJgSixERERERKTAlFiIiIiIiEiBKbEQEREREZECU2IhIiIiBWaxWDCZTHfc/gobN27EZDIxbNiwv6S/e2X27NmYTCZGjx79oEO5b4YNG4bJZGLjxo0POhS5TxwedAAiIiLy6HjmmWdo167dgw5DRB4AJRYiIiJyz7i7uz90owUicm9oKpSIiIj85fbs2cOrr75KuXLlcHR0pHLlyvTq1YvU1NQsdb/88ktatGiBm5sbhQoVokSJEjRu3JgNGzbY1Bs2bBgNGjQAYPjw4TbTsCwWCwChoaE5Tsvq0KGDTV343xSl2bNns3LlSurVq0fx4sVxc3Mz6ly9epWJEycSFBRE0aJFKV68OPXq1WP58uUFu0iAm5sbbm5upKWl0a1bN8qVK0fRokUJCQlh165dAJw8eZI33niDMmXKUKRIERo3bswvv/ySpS2TyURoaCjHjx+ndevWlCxZkqJFixIaGkp8fHy2/aemptKvXz+qVKmCk5MTZcqUoXXr1iQnJ2epm3n9Dh8+zKRJk6hevTpOTk506NCB0NBQhg8fDkCDBg2M1+XW67hhwwbefPNNqlWrRrFixShWrBjBwcF88cUX2caWeT5//PEHb775JmXKlKFw4cI8++yzOU63On/+PB988AH+/v4ULVoUFxcXAgMD+fe//821a9ds6h45coTOnTtTqVIlnJycKFeuHB06dODo0aPZti0asRAREZG/2PLly2nVqhX29vY0b96cihUrkpyczCeffMKaNWvYvn07Tz75pFG/R48eBAQEEBYWRunSpfn1119ZunQpYWFhLFmyhBYtWgA3kwaLxcKcOXOoX78+oaGhRhuurq4FinnRokV8++23NGvWjO7du3P+/HkArly5QpMmTdi4cSOBgYF06tSJa9eusXLlSlq0aMHUqVPp2bNngfq+evUqL7zwAn/++SetW7fm1KlTxMTEEBYWRnx8PE2aNKFs2bK0a9eOX375hRUrVtCsWTP27duHvb29TVtnz56lbt26lCtXji5duvDrr78SHR1NgwYNWLNmjc01S01N5dlnn+WXX34hNDSUV199FYvFQmxsLCtXrmTt2rU899xzWeLt1asX27Zt45///CfNmjXjqaeeMtrdtGkTb7zxhpFQ3Pq6jBkzhl9++YVnn32W8PBwzp07xzfffMNbb73FwYMHmTBhQpa+zp07R926dXF2dqZt27b8/vvvREdH07hxY3bu3Imvr69R9/Tp09SvX5/k5GTMZjNdu3YlIyODAwcOMGbMGN555x0jnu3bt9O4cWMuXrzISy+9hLu7OxaLhXnz5rF69Wq2bt1K1apV7+4FfZRZRURERAroyJEjVsD6zDPPWIcOHZpl27p1q9VqtVpPnz5tdXZ2tlaoUMF69OhRmzbmz59vBaw9e/a0KT98+HCW/lJSUqzly5e3enh42JRv2LDBCliHDh2abZz169e35nT788Ybb1gB65EjR4yyWbNmWQGryWSyrl27NssxgwcPtgLWYcOGWTMyMozy9PR0a3BwsNXR0dH666+/ZtvfrTL7GTVqlE155cqVrYA1MjLSeu3aNaN89OjRVsDq6upq7devn03f3bp1swLWJUuW2LQFWAHr66+/blN/48aNVpPJZHV3d7feuHHDKH/zzTetgDUqKsqmnW+++cYKWD08PGzqZ16/7F5bq9VqHTp0qBWwbtiwIdtrkN3rfO3aNesLL7xgtbe3z9Jm5vl0797dJo6ZM2daAetbb71lUz8yMtIKWAcPHpyln5MnTxrX9+rVq1Y3Nzdr8eLFrYmJiTb1Nm/ebLW3t7c2a9Ys23N43CmxEBERkQLLTCxy2iZNmmS1Wq3WiRMnWgHrV199lW07QUFB1lKlSuWpz169elkBq8ViMcruV2IRHh6epf6NGzesTz75pNXd3d3mRj3T8uXLrYB16tSpuZ5LbonFredotVqtx44dswLWYsWKWS9cuGCz77vvvsv2GgBWe3t7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uHHjBgDJyckEBgba1A0MDGT//v35an/VqlU0b97caNNsNudYNyIiwjjHSZMm5dp2eno6K1euJDQ0NNv9o0aNwsXFxdgqVqyYr9hFRB52mgolIiI2cpoKBbBmzRrKli3Lvn37aNSoUb7bHj58OK+99hrffPMNkyZNYt26dXz11Vd3PMZkMuVaXqdOHU6fPo2zszMjR47M9VjI+1QoAKvVSocOHejevXuOCUNUVBRvv/228Xd6erqSCxF5rGjEQkRE8uTIkSNER0ezfft2Jk+ezOnTp++qnWrVqtGnTx/Wrl1LXFwcAN7e3lnWUyQkJODt7U3JkiU5e/aszb4zZ84YU5zg5hqLY8eO4e/vz9ChQ402ExIS7irG2w0cOJASJUrwzjvv5FjHyckJZ2dnm01E5HGixEJERPKkb9++fPjhh1SqVIm+ffsyePDgfLexatUqrFYrAElJSVSuXBmAt99+m6ioKGNdwqJFizh79iyNGjWiWLFiuLq6Eh8fD8CJEydISkqievXqNm07ODgwadIk5syZw9mzZxkwYACDBg0iNTUVuDnFa86cOfmOefr06SQmJvLZZ5/l+1gRkceJpkKJiIiNzDUWmd58802qVavG+fPniYyMBKB79+4EBwezc+dOatSokee258yZQ79+/ShcuDCFCxdm1qxZwM31DseOHaNGjRqYTCYqV65MXFwcdnZ2xnHdu3cnPT0dBwcHPv/882yfPvX000/Tpk0bvvjiC959911SUlKoW7cuDg4OODk58d577xl1IyIiKFSoEAD+/v7MnTs325h79uxJlSpVqFmzJgB9+vShY8eOeT5nEZHHhcma+dWRiIiI3DPp6em4uLgQ0Gs69k6FH3Q4IvKY2zmu/V0dl/lZlpaWlusUT02FEhERERGRAtNUKBERuedGjhzJokWLbMrefvtt2re/u2/M/go9evRgy5YtNmXjx48nLCzsAUUkIvJw0VQoERGR+0BToUTk70RToURERERE5KGgqVAiIiL30Xcj2ug3LUTksaARCxERERERKTAlFiIiIiIiUmBKLEREREREpMCUWIiIiIiISIFp8baIiMh9FDJkgR43KyL3xd0+QvZ+0YiFiIiIiIgUmBILEREREREpMCUWIiIiIiJSYEosRERERESkwJRYiIiIiIhIgSmxEBERERGRAlNiISIiNhwcHDCbzcY2b948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xMa5c+dspkJt3rwZAJPJxPjx4+nfvz8TJ07EwSH/g949evTAw8ODyMhI5syZw40bNwBITk4mMDDQpm5gYCD79+/PV/urVq2iefPmRptmsznHuhEREcY5Tpo06Y7tRkRE8NRTT1GsWDGj/duNGjUKFxcXY6tYsWK+YhcRedgpsRARERuZU6Eyt3r16hn71qxZQ9myZdm3b99dtT18+HC2bt3K888/z6RJk+jQoUOux+Q0QnBreZ06dShfvjzffvst7dq1y/VYuDkVKvMc77TGIrPub7/9htVqZf369dnWiYqKIi0tzdiOHz9+xzZFRB41SixERCRPjhw5QnR0NNu3b2fy5MmcPn36rtqpVq0affr0Ye3atcTFxQHg7e2dZT1FQkIC3t7elCxZkrNnz9rsO3PmjDHFCW6usTh27Bj+/v4MHTrUaDMhIeGuYsyOo6MjL7/8MkuXLs12v5OTE87OzjabiMjjRImFiIjkSd++ffnwww+pVKkSffv2ZfDgwfluY9WqVVitVgCSkpKoXLkyAG+//TZRUVHGuoRFixZx9uxZGjVqRLFixXB1dSU+Ph6AEydOkJSURPXq1W3adnBwYNKkScyZM4ezZ88yYMAABg0aRGpqKnBzitecOXPyFe/169eNBeY3btxg5cqVeHl55fu8RUQeB3oqlIiI2MhcY5HpzTffpFq1apw/f57IyEgAunfvTnBwMDt37qRGjRp5bnvOnDn069ePwoULU7hwYWbNmgXcXMNw7NgxatSogclkonLlysTFxWFnZ2cc1717d9LT03FwcODzzz/P9ulTTz/9NG3atOGLL77g3XffJSUlhbp16+Lg4ICTkxPvvfeeUTciIoJChQoB4O/vz9y5c7O0d+PGDdq0acOFCxewWq2EhITQtWvXPJ+viMjjxGTN/OpIRERE7pn09HRcXFwI6DUde6fCDzocEXmAdo5r/6BDuGuZn2VpaWm5TvHUVCgRERERESkwTYUSEZF7buTIkSxatMim7O2336Z9+7/vt3Y9evRgy5YtNmXjx48nLCzsAUUkIvJw0VQoERGR+0BToUQkk6ZCiYiIiIiI5JGmQomIiNxH341oo9+0EJHHgkYsRERERESkwJRYiIiIiIhIgSmxEBERERGRAlNiISIiIiIiBabF2yIiIvdRyJAFetysyD30MD+69VGnEQsRERERESkwJRYiIiIiIlJgSixERERERKTAlFiIiIiIiEiBKbEQEREREZECU2IhIiIiIiIFpsRCRORvzGKx0KRJEzw9PfH09GTy5MkADBs2jAoVKmA2m/H29mbBggXGMVarlY8++ggPDw8CAgIIDAxk0qRJNu0OGTKEcuXKkZGRYZQNGzYMZ2dnzp49C8CFCxdwc3Mz4ggODgagY8eOmM1mY3v66aepXbu20c6FCxcoUqQI06ZNs6nv7u6Oq6urcdzBgwdxc3PjwoULdzzX3GK73fbt240+ihUrhpeXF2azmfDwcNzd3Y3+AEJCQti0aZPN9fT19WX58uVZrrPZbKZevXp5et1ERB5HSixERP6mrFYr4eHhvPnmm/z000/s2LGD6OholixZAsCgQYNITExk6dKldOnShWvXrgEwdepUtmzZwq5du9i9ezebNm3i8uXLNm0vXrwYNzc3Nm3aZFPu4uLCJ598cse4Zs2aRWJiIomJiWzbto0nn3yS4cOHG/uXL19OYGAg0dHRNvVnzpxJWFiYcWy1atXyfK55jQ2gdu3aRh/BwcHExsaSmJhIXFwc7du358MPPwRg/vz5VKhQgfr169tcz0WLFvHmm28aSVdmeWJiIps3b861fxGRx5USCxGRv6l169bh6upKq1atAHB2dmbUqFFMmDDBpl61atUoWrQoZ86cAWDMmDFMmzaN4sWLG8cNHjzYqJ+QkECZMmXo2bMnMTExNm116dKFL7/8kosXL+YpxnfffZf69evTpEkToyw6OpoRI0Zw6tQpUlJS7tm55je2nOL9+uuvSUhI4MMPP2T8+PFZ6nh7e+Pg4MDp06fz1faVK1dIT0+32UREHidKLERE/qaSk5MJDAy0KQsMDGT//v02ZT/++CNVqlThqaeeIj09ncuXL1O5cuUc242JiaF169Y0b96clStXcuPGDWPfk08+SUREBDNmzMg1vvXr17NmzRrGjRtnlKWnp7N7927q169Py5YtiY2NvWfnmp/YcuLk5MS4ceOoX78+nTp1onz58lnqbN++HTs7O0qXLg3A6NGjjalQbdu2zbHtUaNG4eLiYmwVK1a86zhFRB5GSixERB4iJpPJ+P+jR4/Gx8eH5557jqFDh2Zbf+7cucY6iEuXLgE3p0G98sorFC9enKCgIDZs2GBzzDvvvMMnn3zC1atXc4zj3LlzdO7cmblz51KkSBGjfOnSpTRr1gw7OztatWqVZUTkbs81P7Hl5h//+Aeurq506dLFpjwzgejfvz/R0dFG/7dOhZo3b16O7UZFRZGWlmZsx48fv+sYRUQeRg4POgAREcmet7c3cXFxNmW7du3C29sbuHnD27NnT5YtW0anTp04dOgQzs7OFC5cmGPHjlGpUiXat29P+/btcXNzIyMjgx07dnDs2DFjsfXFixcpXbo0YWFhRh9ly5YlLCyMr776KsfYunfvzhtvvEGtWrVsymNiYtixYwdff/01AL/99hsnTpygQoUKBTrX/MSWF3Z2dtjZ2X63lnk975aTkxNOTk4FiktE5GGmEQsRkb+psLAwzp49a3zrn56eTlRUFG+//bZNvRYtWhAYGGjcbA8YMICePXsaTz+6fv06169fB26ufxgzZgwWiwWLxcLhw4dZtWqVsT/TwIEDbZ7KdKvo6GgOHTrEkCFDbMrPnTtHQkICv/76q9H+O++8w6JFi+7ZueYWm4iIPDhKLERE/qbs7OyIi4tj5syZeHp6UqNGDSIjI3nllVey1B06dCiTJ0/GarXSu3dvatasSWBgIGazmfr169O3b1+KFClCbGwsLVq0MI4rXrw4ZrOZdevW2bRXtWpV6tSpk21c77//Pr/99hvBwcHG2oMGDRoQFxfHiy++iL29vVE3PDzceDrUvTrXO8V2P9y6xsJsNhdoGpaIyKPMZLVarQ86CBERkUdNeno6Li4uBPSajr1T4QcdjsgjY+e49g86hMdK5mdZWloazs7Od6yrEQsRERERESkwLd4WEZGHVlJSEq+//rpNmbu7e54fcysiIveOEgsREXlo+fn5kZiY+KDDEBERNBVKRERERETuAY1YiIiI3EffjWiT64JHEZFHgUYsRERERESkwJRYiIiIiIhIgSmxEBERERGRAlNiISIiIiIiBabEQkRERERECkxPhRIREbmPQoYswN6p8IMO47G0c1z7Bx2CyGNFIxYiIiIiIlJgSixERERERKTAlFiIiIiIiEiBKbEQEREREZECU2IhIiIiIiIFpsRCREREREQKTImFiEgemUwmunfvbvz922+/YW9vz7Bhw4wyq9VKpUqVGDhwoFGWlpaGu7s7v/76KwCpqalUrVqVU6dOZdvPsGHD+OSTT+7PSRSQxWKhSJEiBAYGUq1aNerUqcOSJUts6ly4cIEiRYowbdo0AEaPHk3v3r2N/QcOHMDPz4+rV68yY8YM/P398ff3JyAggG3btuXY97lz53jjjTeoWrUq1atX56WXXuLo0aNGTGazGW9vb9q3b8+1a9cA2LhxI66urpjNZmM7ePBgrueR+Rq89957mM1mfHx8jD7MZjMbNmy4l5dVROSRoN+xEBHJoxIlSrBt2zZu3LiBvb09sbGxVK9e3abO1q1bKVeuHEuWLGHs2LEAuLi4MGTIEN555x0WLlzI4MGD6d27N0899dQ9jzEztvvJx8eHHTt2AJCUlETz5s0pVqwYL774IgDLly8nMDCQ6OhounfvzjvvvENgYCB79+7F19eXPn36MGHCBH7//XcmT57Mjz/+SJEiRUhNTeXKlSs59tuxY0cCAwOZM2cOADt27OCPP/6gVKlSRkzXr18nLCyMmJgY2rZtC0BYWBixsbE2bVksllzPA2DkyJGMHDkSi8VCRESEUV9ERLLSiIWISB6ZTCbq1avHpk2bAIiLi6Nly5Y2daKjo+natStVqlRh+/btRvkbb7zBsWPHmDBhAtu2baNnz5537OvHH38kNDQUT09Pli5dCsDs2bPp37+/USc4OBiLxYLFYiEgIIB//etfBAYGcuXKFfr06UOtWrUwm83G8YcOHaJevXoEBQXx7LPPsn///ju2mxd+fn68//77xuhE5jUYMWIEp06dIiUlhSeeeILJkyfTu3dvli5daty8//777xQtWpRChQoBULJkScqXL59tPz///DN79uxhyJAhNnEGBwfb1HNwcODZZ5/lxIkTeYr/TueRX1euXCE9Pd1mExF5nCixEBHJh1atWhETE0NKSgqOjo6UKlXK2Ge1WlmxYgXh4eFERkYSHR1t7DOZTIwfP57+/fszceJEHBzuPGCcnJzMt99+y/r16+nduzeXL1++Y/19+/bRq1cv9uzZw6xZs3Bzc+OHH37gu+++IyoqiitXrlCuXDnWrVvHrl27mDhxIoMHDy7Yxfj/goKCOHjwIADp6ens3r2b+vXr07JlS2OkICwsjFKlStG1a1cmTpwIQEBAAMWLF6dq1ap06dKFdevW5djH/v378ff3x87uzv/Zunz5MvHx8TRu3NgoW7dunc1UqJyu5a3ncTdGjRqFi4uLsVWsWPGu2xIReRgpsRARyYc6derwww8/sHDhQiIiImz2bd68GR8fH1xdXWnZsiVx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xEJERO6L48eP079/f3r27ElGRgZLly7l4MGDWCwWLBYLH3/8MTExMdkee+HCBb777jvj76SkJCpXrpynfk+fPs3hw4epVKlSjnVKlSrFqFGjGDNmTP5OSkREcqTEQkRE7plz585hNpvx8fHh5ZdfpmvXrnTq1IlNmzbh4eFByZIljbotWrRgyZIlZGRkZGnHarUyatQo4xGy//3vf5k8efId+46IiMBsNhMSEsLIkSMpW7bsHeu/8sornD9/3lhELiIiBWOy3joBVkRERO6J9PR0XFxcCOg1HXunwg86nIfOznHtH3QIIsL/PsvS0tJyneKpEQsRERERESkw/UCeiIg8NHr06MGWLVtsysaPH3/HpzWJiMhfQ4mFiIg8ND799NMHHYKIiORAU6FERERERKTANGIhIiJyH303oo1+00JEHgsasRARERERkQJTYiEiIiIiIgWmxEJERERERApMiYWIiIiIiBSYFm+LiIjcRyFDFuiXt+9Av7At8ujQiIWIiIiIiBSYEgsRERERESkwJRYiIiIiIlJgSixERERERKTAlFiIiIiIiEiBKbEQEREREZECU2IhIiI2jh8/zssvv8wzzzyDj48Pbdu25ezZs6xfv57AwEC8vLwwm82sX7/eOCY0NBQvLy/8/Pzw9vZm4MCBXL58GQCLxUKRIkUwm83GtmHDhhz737dvHy+++CLPPPMMQUFBtGjRgp9//hmADh06ULVqVaOd1q1bAzBs2DCcnZ05e/YsABcuXMDNzc2m/8DAQKpVq0adOnVYsmSJ0d+wYcOoUKGC0Wa9evUAmD17NmXKlMFsNlOtWjUmTZp07y6yiMgjSL9jISIiBqvVSnh4OL1792bp0qUAfPvttyQnJ9OxY0e++eYbfHx8SE5OpkmTJmzdupWnn34agNjYWHx9fbl06RJdu3alU6dOzJ8/HwAfHx927NiRa/+XLl2iefPmfPrppzRp0gSADRs2cPjwYTw8PACYMmUKzZo1y3Ksi4sLn3zyCf/+97+z7Lu1/6SkJJo3b06xYsV48cUXARg0aBA9e/bMclz79u0ZP348f/zxB15eXkRERFCxYsVcz0NE5HGkEQsRETGsX7+e4sWL0779/3607MUXX2TVqlV06tQJHx8f4OaN+ptvvsm0adOytFGkSBE+/fRTVq5cSWpqar76nzdvHiEhIUZSAdCgQQMaN26c67FdunThyy+/5OLFi3es5+fnx/vvv59t7DkpXbo0Hh4epKSk5FjnypUrpKen22wiIo8TJRYiImJITk7GbDZnWx4YGGhTFhgYyP79+7Ntp3jx4lStWpVffvnFpt3M7dChQ9ket3///mz7v1Xv3r2NdgYMGGCUP/nkk0RERDBjxow7Hg8QFBTEwYMHjb9Hjx5ttNm2bdss9S0WCxcvXiQgICDHNkeNGoWLi4uxaWRDRB43mgolIiIGq9WKyWS6Z21lyutUqNv7r1OnDqmpqbRt25b3338fyHkqFMA777zD888/bzPikltskPNUqLlz57JmzRoOHDjAp59+SqFChXJsMyoqirffftv4Oz09XcmFiDxWNGIhIiIGHx8fEhISspR7e3uza9cum7KEhAS8vb2zbefChQscOXLEWBeRn/4TExONv+Pj44mKisrztKKyZcsSFhbGV199dcd6iYmJeHl55dpe+/btSUpKIj4+noEDB3Ly5Mkc6zo5OeHs7GyziYg8TpRYiIiIISwsjLS0NP773/8aZStWrKBJkyb85z//ITk5Gbg5Zek///kP3bp1y9LG5cuX6dmzJ82bN6dEiRL56r9t27Zs3LiRb7/91qa9/Bg4cCCTJ0/Ocf++ffv48MMP6d69e57brFmzJu3atWPq1Kn5ikVE5HGixEJERAwmk4mlS5cSExODu7s71atXJyYmBn9/f7788ktee+01vLy8ePXVV/nPf/5DhQoVjGMjIiLw8/MjKCiIp556ii+++MLYd/sai9jY2Gz7L1KkCMuWLWPs2LG4u7tTp04d1q5dS8eOHY06t66xCAsLy9JG1apVqVOnjk1Z5hoRLy8vunTpwoQJE3jhhReM/beusTCbzVy9ejVLu4MGDWL27NlcunQp7xdUROQxYrLePtFURERECiw9PR0XFxcCek3H3qnwgw7nb2vnuDuvhxGRByvzsywtLS3XKZ4asRARERERkQLTU6FEROQvl5qaSqNGjWzKihQpQnx8/AOKSERECkqJhYiI/OVKlixp8/QnERF5+GkqlIiIiIiIFJhGLERERO6j70a00W9aiMhjQSMWIiIiIiJSYEosRERERESkwJRYiIiIiIhIgSmxEBERERGRArurxduHDh1i1qxZHDp0iI8//pgyZcrwzTffULFiRapXr36vYxQREXlohQxZoF/evgP98rbI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9ddfN8AINXf16lUBgJCamioIQtOcY+vWrYVvvvmmSc3t5s2bgrW1tbBnzx6hT58+wtSpUwVBaPyf34IFCwQnJ6cq817EufGOBRER0TNy//59HDlyBIMGDVJJHzRoENLS0hpoVPXn/PnzuHz5ssp8dXV10adPn0Y735KSEgCAsbExgKY1x0ePHmHLli24ffs2evXq1aTmNnHiRAwdOhReXl4q6U1hjqdPn4aZmRk6duyIESNG4Ny5cwBezLlpN0ivRERETdDff/+NR48eoV27dirp7dq1w+XLlxtoVPVHOaeq5nvhwoWGGJJGBEHAjBkz4OHhAXt7ewBNY465ubno1asX7t27h5YtWyIxMRFSqVQ8+WzMcwOALVu2ICsrC5mZmZXyGvvn16NHD2zatAk2Nja4cuUKFi1aBDc3Nxw/fvyFnBsDCyIiomdMIpGovBcEoVJaU9JU5jtp0iQcPXoUBw4cqJTXmOf4xhtvQC6Xo7i4GNu2bcN7772H1NRUMb8xz62goABTp07F7t270bx582rLNdY5DhkyRPzZwcEBvXr1QqdOnfD999+jZ8+eAF6suXEpFBER0TNiamoKLS2tSncnrl69WumqYlOgfDpNU5jv5MmTsWPHDuzbtw/m5uZielOYo46ODjp37gxXV1dERkbCyckJq1evbhJzO3LkCK5evYquXbtCW1sb2traSE1NxZo1a6CtrS3OozHP8XH6+vpwcHDA6dOnX8jPj4EFERHRM6Kjo4OuXbtiz549Kul79uyBm5tbA42q/nTs2BGvvvqqynzv37+P1NTURjNfQRAwadIkbN++Hf/73//QsWNHlfymMMcnCYKAsrKyJjG3AQMGIDc3F3K5XHy5urpi9OjRkMvlsLKyavRzfFxZWRny8vLQvn37F/Lz41IoIiKiZ2jGjBl499134erqil69emH9+vXIz89HaGhoQw/tqdy6dQtnzpwR358/fx5yuRzGxsZ4/fXXMW3aNCxZsgTW1tawtrbGkiVLoKenh1GjRjXgqNU3ceJEbN68GT/99BNatWolXv01NDREixYtxO9EaKxz/PjjjzFkyBB06NABN2/exJYtW5CSkoJff/210c8NAFq1aiXuh1HS19eHiYmJmN6Y5xgWFoa3334br7/+Oq5evYpFixahtLQU77333ov5+TXIs6iIiIiasK+++kqwsLAQdHR0BBcXF/HRpY3Rvn37BACVXu+9954gCBWPvFywYIHw6quvCrq6ukLv3r2F3Nzchh10HVQ1NwDCxo0bxTKNeY7vv/+++LvYpk0bYcCAAcLu3bvF/MY8t+o8/rhZQWjccxw+fLjQvn174ZVXXhHMzMwEf39/4fjx42L+izY3iSAIQsOENERERERE1FRwjwUREREREWmMgQUREREREWmMgQUREREREWmMgQUREREREWmMgQUREREREWmMgQUREREREWmMgQUREREREWmMgQUREREREWmMgQURERFRLfr27Ytp06Y19DCIXmj85m0iIiKiWly/fh2vvPIKWrVq1dBDqSQlJQX9+vXDjRs3YGRk1NDDoZeYdkMPgIiIiOhFZ2xs3NBDqNKDBw8aeghEIi6FIiIiIqrF40uhLC0tsWjRIgQHB6Nly5awsLDATz/9hL/++gs+Pj5o2bIlHBwccPjwYbF+TEwMjIyMkJSUBBsbGzRv3hwDBw5EQUGBSj/r1q1Dp06doKOjgzfeeAP/+c9/VPIlEgm+/vpr+Pj4QF9fHx988AH69esHAGjdujUkEgnGjh0LAPj111/h4eEBIyMjmJiYwNvbG2fPnhXbUigUkEgk2L59O/r16wc9PT04OTkhPT1dpc+DBw+iT58+0NPTQ+vWrTF48GDcuHEDACAIAj7//HNYWVmhRYsWcHJyQkJCwjM55tT4MLAgIiIiqqMvvvgC7u7uyM7OxtChQ/Huu+8iODgYY8aMQVZWFjp37ozg4GA8vuL8zp07WLx4Mb7//nscPHgQpaWlGDFihJifmJiIqVOnYubMmTh27Bj+9a9/ISQkBPv27VPpe8GCBfDx8UFubi4WLlyIbdu2AQBOnjyJoqIirF69GgBw+/ZtzJgxA5mZmdi7dy+aNWsGPz8/lJeXq7T3ySefICwsDHK5HDY2Nhg5ciQePnwIAJDL5RgwYAC6dOmC9PR0HDhwAG+//TYePXoEAJg3bx42btyIdevW4fjx45g+fTrGjBmD1NTUZ3/Q6cUnEBEREVGN+vTpI0ydOlUQBEGwsLAQxowZI+YVFRUJAIR///vfYlp6eroAQCgqKhIEQRA2btwoABAyMjLEMnl5eQIA4dChQ4IgCIKbm5swfvx4lX4DAwOFt956S3wPQJg2bZpKmX379gkAhBs3btQ4h6tXrwoAhNzcXEEQBOH8+fMCAOGbb74Ryxw/flwAIOTl5QmCIAgjR44U3N3dq2zv1q1bQvPmzYW0tDSV9HHjxgkjR46scSzUNPGOBREREVEdOTo6ij+3a9cOAODg4FAp7erVq2KatrY2XF1dxfe2trYwMjJCXl4eACAvLw/u7u4q/bi7u4v5So+3UZOzZ89i1KhRsLKygoGBATp27AgAyM/Pr3Yu7du3Vxm38o5FVU6cOIF79+5h4MCBaNmypfjatGmTypIrenlw8zYRERFRHb3yyivizxKJpNq0J5cdKdOrS3syXxCESmn6+vpqjfHtt99Ghw4dsGHDBpiZmaG8vBz29va4f/9+rXNRjrtFixbVtq8s89///hevvfaaSp6urq5aY6SmhXcsiIiIiJ6Dhw8fqmzoPnnyJIqLi2FrawsAsLOzw4EDB1TqpKWlwc7OrsZ2dXR0AEDc9wAA165dQ15eHubNm4cBAwbAzs5O3HBdF46Ojti7d2+VeVKpFLq6usjPz0fnzp1VXh06dKhzX9T48Y4FERER0XPwyiuvYPLkyVizZg1eeeUVTJo0CT179kT37t0BALNmzUJQUBBcXFwwYMAA7Ny5E9u3b0dycnKN7VpYWEAikWDXrl1466230KJFC7Ru3RomJiZYv3492rdvj/z8fISHh9d5zHPnzoWDgwMmTJiA0NBQ6OjoYN++fQgMDISpqSnCwsIwffp0lJeXw8PDA6WlpUhLS0PLli3x3nvvPdVxosaLdyyIiIiIngM9PT3MmTMHo0aNQq9evdCiRQts2bJFzPf19cXq1auxbNkydOnSBf/3f/+HjRs3om/fvjW2+9prr+HTTz9FeHg42rVrh0mTJqFZs2bYsmULjhw5Ant7e0yfPh3Lli2r85htbGywe/du5OTkoHv37ujVqxd++uknaGtXXJv+7LPPMH/+fERGRsLOzg6DBw/Gzp07xf0c9HLhN28TERER1bOYmBhMmzYNxcXFDT0UonrDOxZERERERKQxBhZERERERKQxLoUiIiIiIiKN8Y4FERERERFpjIEFERERERFpjIEFERERERFpjIEFERERERFpjIEFERERERFpjIEFERERERFpjIEFERERERFpjIEFERERERFpjIEFERERERFp7P8B1Or6O4jveHsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "features_importance = pd.DataFrame(\n", " {\n", " 'importance': lgbm_model.feature_importances_,\n", " 'feature': lgbm_model.feature_name_\n", " }\n", ")\n", "features_importance_plot = features_importance.sort_values(by='importance', ascending=False).head(20)\n", "\n", "plt.figure(figsize=(8, 6), dpi=100) \n", "sns.barplot(data=features_importance_plot, x='importance', y='feature')\n", "\n", "plt.yticks(fontsize=7) # 进一步微调\n", "plt.title('Feature Importance', fontsize=14)\n", "plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": 86, "id": "a2b54eca", "metadata": {}, "outputs": [], "source": [ "import time\n", "import os\n", "\n", "def submit(ids, pred, name, feature_count=None):\n", " \"\"\"\n", " ids: 测试集的 SK_ID_CURR\n", " pred: 模型预测概率\n", " name: 你的实验备注 (如 'lgb_v1', 'baseline')\n", " feature_count: 可选,记录模型使用了多少个特征\n", " \"\"\"\n", " # 1. 创建提交 DataFrame\n", " submit_df = pd.DataFrame({\n", " 'SK_ID_CURR': ids,\n", " 'TARGET': pred\n", " })\n", "\n", " # 2. 生成时间戳 (格式: 0213_1530)\n", " timestamp = time.strftime(\"%m%d_%H%M\")\n", " \n", " # 3. 构造文件名\n", " # 格式: 0213_1530_lgb_v1_f542.csv\n", " f_str = f\"_f{feature_count}\" if feature_count else \"\"\n", " filename = f\"{timestamp}_{name}{f_str}.csv\"\n", " \n", " # 4. 确保保存目录存在 (可选)\n", " if not os.path.exists('submissions'):\n", " os.makedirs('submissions')\n", " \n", " save_path = os.path.join('submissions', filename)\n", " \n", " # 5. 保存并打印提示\n", " submit_df.to_csv(save_path, index=False)\n", " \n", " return submit_df\n" ] }, { "cell_type": "code", "execution_count": 87, "id": "7fbe2ec1", "metadata": {}, "outputs": [], "source": [ "lgbm_model_pred = lgbm_model.predict_proba(test_features)" ] }, { "cell_type": "code", "execution_count": 88, "id": "0a9fe02c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SK_ID_CURRTARGET
3075111000010.072112
3075121000050.162662
3075131000130.029653
3075141000280.034053
3075151000380.139559
\n", "
" ], "text/plain": [ " SK_ID_CURR TARGET\n", "307511 100001 0.072112\n", "307512 100005 0.162662\n", "307513 100013 0.029653\n", "307514 100028 0.034053\n", "307515 100038 0.139559" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "submit_df = submit(test['SK_ID_CURR'], lgbm_model_pred[:, 1], \n", " name='lgbm_baseline',\n", " feature_count=train_features.shape[1]\n", " )\n", "submit_df.head()\n" ] }, { "cell_type": "markdown", "id": "07b952f4", "metadata": {}, "source": [ "得分76,差不多" ] }, { "cell_type": "markdown", "id": "54eb6587", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "data-analysis", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.25" } }, "nbformat": 4, "nbformat_minor": 5 }